1
我寫了一個函數來獲取CoreData中的數據庫。這個函數將關閉並運行performBackgroundTask
來獲取數據。然後,將結果傳遞給閉包運行。 我AppDelegate
寫靜態屬性,我可以方便地訪問viewContext
:CoreData的performBackgroundTask方法崩潰
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
static var persistentContainer: NSPersistentContainer {
return (UIApplication.shared.delegate as! AppDelegate).persistentContainer
}
static var viewContext: NSManagedObjectContext {
return persistentContainer.viewContext
}
// ...
}
以下是我寫的函數(不是法)墜毀利用context
:
func fetch<T>(fetchRequest: NSFetchRequest<T>, keyForOrder: String? = nil, format: String? = nil, keyword: String? = nil, handler: (([T]?)->Void)? = nil) where T:NSManagedObject, T: NSFetchRequestResult {
AppDelegate.persistentContainer.performBackgroundTask{(context: NSManagedObjectContext) in
if let format = format?.trimmingCharacters(in: .whitespacesAndNewlines),
!format.isEmpty,
let keyword = keyword?.trimmingCharacters(in: .whitespacesAndNewlines),
!keyword.isEmpty {
fetchRequest.predicate = NSPredicate(format: format, keyword)
}
if let keyForOrder = keyForOrder {
fetchRequest.sortDescriptors = [NSSortDescriptor(key: keyForOrder, ascending: true)]
}
guard let cats = try? context.fetch(fetchRequest) else { // crash
return
}
context.performAndWait(){ // crash
if let handler = handler {
handler(cats)
}
}
}
}
,但如果我更換context
與AppDelegate.viewContext
,功能不會崩潰:
func fetch<T>(fetchRequest: NSFetchRequest<T>, keyForOrder: String? = nil, format: String? = nil, keyword: String? = nil, handler: (([T]?)->Void)? = nil) where T:NSManagedObject, T: NSFetchRequestResult {
AppDelegate.persistentContainer.performBackgroundTask{(context: NSManagedObjectContext) in
if let format = format?.trimmingCharacters(in: .whitespacesAndNewlines),
!format.isEmpty,
let keyword = keyword?.trimmingCharacters(in: .whitespacesAndNewlines),
!keyword.isEmpty {
fetchRequest.predicate = NSPredicate(format: format, keyword)
}
if let keyForOrder = keyForOrder {
fetchRequest.sortDescriptors = [NSSortDescriptor(key: keyForOrder, ascending: true)]
}
guard let cats = try? AppDelegate.viewContext.fetch(fetchRequest) else { // crash
return
}
AppDelegate.viewContext.performAndWait(){ // crash
if let handler = handler {
handler(cats)
}
}
}
}
什麼正在發生?
謝謝。
謂詞沒問題。只有viewcode衝突Xcode顯示。隨着應用程序變得越來越大,我刪除了performbacktask,我總是需要傳遞給UI員工的主隊列。我只是不明白,如果我使用上下文將會導致performbacktask提供的崩潰。 –
對performBackgroundTask提供的上下文的提取不會崩潰。它在你的代碼中崩潰,因爲你做錯了什麼。代碼有很多錯誤,並且我沒有看到崩潰報告,所以很難確定究竟是什麼導致了崩潰。但是,我最好的客戶將是實際的崩潰,這是因爲在上下文關閉之後訪問後臺上下文的managedObjects(上述第二項)。 –