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(上述第二项)。 –