문제

Simulator Screen Recording - iPhone SE (3rd generation) - 2024-11-29 at 04.26.46.mov

원인

func readAll() async throws -> [Entity] {
    try await context.perform {
        let playlists = try self.context.fetch(self.fetchRequest)
        return playlists.map { playlist in
            let filter = MusicFilter(genres: playlist.filters.compactMap { MusicGenre(rawValue: $0) })
            return MolioPlaylist(id: playlist.id,
                          name: playlist.name,
                          createdAt: playlist.createdAt,
                          musicISRCs: playlist.musicISRCs,
                          filter: filter
            )
        }
    }
}
final class CoreDataPlaylistStorage: PlaylistLocalStorage {
    private let context: NSManagedObjectContext
    **private let fetchRequest: NSFetchRequest<Playlist> = Playlist.fetchRequest()**
    ...
    func readAll() async throws -> [Entity] {
        try await context.perform {
            let playlists = try self.context.fetch(self.fetchRequest)
            return playlists.map { playlist in
                let filter = MusicFilter(genres: playlist.filters.compactMap { MusicGenre(rawValue: $0) })
                return MolioPlaylist(id: playlist.id,
                              name: playlist.name,
                              createdAt: playlist.createdAt,
                              musicISRCs: playlist.musicISRCs,
                              filter: filter
                )
            }
        }
    }
    
    // Update
    func update(_ entity: MolioPlaylist) async throws {
        try await context.perform {
						**// ❌ 여기서 설정된 쿼리가 그대로 남아 있는 채로 readAll() 메서드가 호출되면 해당 쿼리 조건에 맞는 엔티티들만 불러온다.**
            **self.fetchRequest.predicate = NSPredicate(format: "id == %@", entity.id as CVarArg)**
            do {
                guard let playlist = try self.context.fetch(self.fetchRequest).first else {
                    throw CoreDataError.notFound
                }
                playlist.name = entity.name
                playlist.musicISRCs = entity.musicISRCs
                playlist.filters = entity.filter.genres.map(\\.rawValue)
                
                try self.saveContext()
            } catch {
                throw CoreDataError.saveFailed
            }
        }
    }
		...
}

해결 방법

func readAll() async throws -> [Entity] {
    **fetchRequest.predicate = nil**
    return try await context.perform {
        let playlists = try self.context.fetch(self.fetchRequest)
        return playlists.map { playlist in
            let filter = MusicFilter(genres: playlist.filters.compactMap { MusicGenre(rawValue: $0) })
            return MolioPlaylist(id: playlist.id,
                          name: playlist.name,
                          createdAt: playlist.createdAt,
                          musicISRCs: playlist.musicISRCs,
                          filter: filter
            )
        }
    }
}