SwiftUI에서 CoreData 처리 후 Preview 충돌 시 해결 방법

14557 단어 iOSSwifttech
코어데이터와 스위프트UI를 배우는 과정에서 토도 앱을 만들던 중 코어데이터의 피치 리퀘스트 설치 화면의 미리보기가 무너져 2일 정도 푹 빠졌는데 해법을 소개한다.

매혹적인 편


충돌을 미리 볼 때 다음과 같습니다.
// View
struct ContentView: View {
    @Environment(\.managedObjectContext) var viewContext
    
    @State private var isPresent: Bool = false
    @Environment(\.timeZone) private var timeZone
    
    @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Todo.limitDate, ascending: true)], animation: .default)
    
    private var todos: FetchedResults<Todo>
    
    ...
    
    var body: some View {
        ...
    }
}

// Model
class TodoModel: ObservableObject {
    static let shared = TodoModel()
    
    static var fetchRequest: NSFetchRequest<Todo> {
        let request: NSFetchRequest<Todo> = Todo.fetchRequest()
        request.sortDescriptors = [NSSortDescriptor(keyPath: \Todo.limitDate, ascending: true)]
        return request
    }
    
    static var preview: TodoModel {
        let model = TodoModel(inMemory: true)
        let viewContext = model.container.viewContext
        viewContext.reset()
        for i in 0..<10 {
            let item = Todo(context: viewContext)
            item.title = "Todo \(i + 1)"
            item.limitDate = Date()
        }
        do {
            try viewContext.save()
        } catch {
            fatalError(error.localizedDescription)
        }
        return model
    }
    
    let container: NSPersistentContainer
    
    private init(inMemory: Bool = false) {
        container = NSPersistentContainer(name: "TodoList")
        if inMemory {
            container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
        }
        container.loadPersistentStores { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Error \(error), \(error.userInfo)")
            }
        }
    }
    
    ...
}
SwiftUI는 CoreData에서 데이터를 가져오는 시뮬레이션이 있습니다.
그걸 설치하면 왠지 미리보기가 붕괴될 것 같아.

해결편


각양각색의 조사에서 도착했다이 정보.
마지막 페이지에서
추출 요청 생성을 새 정적 변수로 이동하고 다른 @FetchRequest 잠금 레지스터를 사용하면 충돌하지 않습니다
라고 기재했기 때문에 기재한 대로 수정했다.
// Model
class TodoModel: ObservableObject {
    ...
    // FetchRequestのstatic変数を実装
    static var fetchRequest: NSFetchRequest<Todo> {
        let request: NSFetchRequest<Todo> = Todo.fetchRequest()
        request.sortDescriptors = [NSSortDescriptor(keyPath: \Todo.limitDate, ascending: true)]
        return request
    }
    ...
}
// View
struct ContentView: View {
    ...
    // 引数にModelで実装したFetchRequestを指定
    @FetchRequest(fetchRequest: TodoModel.fetchRequest)
    ...
}
이렇게 하면 붕괴가 없고 안전하게 미리보기가 표시됩니다!🎉
아직 명확한 이유는 없지만 알면 업데이트하고 싶어요.
같은 상태에서 빠져있는 사람에게 도움이 되었으면 좋겠어요.

좋은 웹페이지 즐겨찾기