Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions PickaView/Data/Persistence/CoreDataManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ final class CoreDataManager {

let persistentContainer: NSPersistentContainer
let mainContext: NSManagedObjectContext
let fetchedResults: NSFetchedResultsController<VideoEntity>
let fetchedResults: NSFetchedResultsController<Video>

private init() {
// Core Data 스택 초기화
Expand All @@ -26,7 +26,7 @@ final class CoreDataManager {
persistentContainer = container
mainContext = container.viewContext

let request: NSFetchRequest<VideoEntity> = VideoEntity.fetchRequest()
let request: NSFetchRequest<Video> = Video.fetchRequest()

fetchedResults = NSFetchedResultsController(
fetchRequest: request,
Expand Down Expand Up @@ -58,7 +58,7 @@ final class CoreDataManager {
for video in videos {
let videoId = Int64(video.id)

let request: NSFetchRequest<VideoEntity> = VideoEntity.fetchRequest()
let request: NSFetchRequest<Video> = Video.fetchRequest()
request.predicate = NSPredicate(format: "id == %d", videoId)

if let existing = try? mainContext.fetch(request).first {
Expand All @@ -72,7 +72,7 @@ final class CoreDataManager {

// 새 비디오 엔티티를 Core Data에 생성하고 속성 세팅
private func insert(_ video: PixabayVideo) {
let newVideo = VideoEntity(context: mainContext)
let newVideo = Video(context: mainContext)
newVideo.id = Int64(video.id)
newVideo.url = video.videos.medium.url
newVideo.comments = Int64(video.comments)
Expand All @@ -83,7 +83,7 @@ final class CoreDataManager {
}

// 기존 Core Data 엔티티에 새 비디오 데이터로 속성 업데이트
func update(entity: VideoEntity, with video: PixabayVideo) {
func update(entity: Video, with video: PixabayVideo) {
entity.url = video.videos.medium.url
entity.comments = Int64(video.comments)
entity.user = video.user
Expand All @@ -109,7 +109,8 @@ final class CoreDataManager {
/// - Parameters:
/// - tags: 추가할 tag들
/// - watchProgress: 현재 시청 중인 영상 시간 / 전체 영상 시간
func calculateUserTagScores(for tags: Set<TagEntity>, watchProgress: Double) {
func updateTagScores(for tags: NSSet?, watchProgress: Double) {
guard let tags = tags as? Set<Tag> else { return }
guard watchProgress > 0.3 else { return }

for tag in tags {
Expand Down
15 changes: 0 additions & 15 deletions PickaView/Data/Persistence/Model/TagEntity+CoreDataClass.swift

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

15 changes: 0 additions & 15 deletions PickaView/Data/Persistence/Model/VideoEntity+CoreDataClass.swift

This file was deleted.

This file was deleted.

6 changes: 3 additions & 3 deletions PickaView/Model.xcdatamodeld/Model.xcdatamodel/contents
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="23788.4" systemVersion="24F74" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithSwiftData="YES" userDefinedModelVersionIdentifier="">
<entity name="Tag" representedClassName="TagEntity" syncable="YES">
<entity name="Tag" representedClassName="Tag" syncable="YES" codeGenerationType="class">
<attribute name="lastUpdated" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="name" attributeType="String"/>
<attribute name="score" optional="YES" attributeType="Double" defaultValueString="0" usesScalarValueType="YES"/>
<relationship name="videos" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="Video" inverseName="tags" inverseEntity="Video"/>
</entity>
<entity name="TimeStamp" representedClassName="TimeStampEntity" syncable="YES">
<entity name="TimeStamp" representedClassName="TimeStamp" syncable="YES" codeGenerationType="class">
<attribute name="endTime" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="startTime" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="whole" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/>
<relationship name="video" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Video" inverseName="timeStamp" inverseEntity="Video"/>
</entity>
<entity name="Video" representedClassName="VideoEntity" syncable="YES">
<entity name="Video" representedClassName="Video" syncable="YES" codeGenerationType="class">
<attribute name="comments" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/>
<attribute name="downloads" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/>
<attribute name="id" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/>
Expand Down
4 changes: 2 additions & 2 deletions PickaView/Recommendation/RecommendationScorer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ enum RecommendationScorer {
/// - Parameters:
/// - video: 추천 점수를 계산할 대상 VideoEntity
/// - Returns: 0이상 Double 값의 추천 점수
static func calculateRecommendationScore(for video: VideoEntity) -> Double {
static func calculateRecommendationScore(for video: Video) -> Double {
// 각 tag score에 time decay를 곱해 합산
guard let tags = video.tags else { return 0.0 }
guard let tags = video.tags as? Set<Tag> else { return 0.0 }
let userTagValue = tags.reduce(0.0) { $0 + ($1.score * decayWeight(for: $1.lastUpdated)) }

let likeBoost = video.isLiked ? 5.0 : 0.0
Expand Down
2 changes: 1 addition & 1 deletion PickaView/Recommendation/VideoRecommender.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ enum VideoRecommender {
/// 전체 영상을 받아 추천 점수를 계산한 후, 점수 기준으로 정렬된 영상 리스트를 반환
/// - Parameter allVideos: 추천 점수를 계산할 VideoEntity 배열
/// - Returns: 추천 점수 기준으로 정렬된 VideoEntity 배열
static func sortVideosByRecommendationScore(from allVideos: [VideoEntity]) -> [VideoEntity] {
static func sortVideosByRecommendationScore(from allVideos: [Video]) -> [Video] {
let scoredVideos = allVideos.map { video in
let score = RecommendationScorer.calculateRecommendationScore(for: video)
return (video, score)
Expand Down