Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在后台使用核心数据?_Ios_Swift_Core Data_Concurrency - Fatal编程技术网

Ios 如何在后台使用核心数据?

Ios 如何在后台使用核心数据?,ios,swift,core-data,concurrency,Ios,Swift,Core Data,Concurrency,在创建了从CoreData获取数据的简单代码之后,我意识到触发了一些未知错误。我读到在后台获取数据并不是那么简单。不幸的是,我是iOS开发新手,只知道Swift,那里有很多关于这方面的objective-C教程。 这是我的代码: func reloadData() { let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT dispatch_async(dispatch_get_global_queue(priority, 0)) {

在创建了从CoreData获取数据的简单代码之后,我意识到触发了一些未知错误。我读到在后台获取数据并不是那么简单。不幸的是,我是iOS开发新手,只知道Swift,那里有很多关于这方面的objective-C教程。 这是我的代码:

func reloadData() {
    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
    dispatch_async(dispatch_get_global_queue(priority, 0)) {
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let managedContext = appDelegate.managedObjectContext

        let fetchRequest = NSFetchRequest(entityName: "Person")
        do {
            let results = try managedContext.executeFetchRequest(fetchRequest)
            let people = results as! [NSManagedObject]
            for person in people {
                collectionViewData.append(person)
            }
        } catch let error as NSError {
            print("Could not fetch \(error), \(error.userInfo)")
        }
        dispatch_async(dispatch_get_main_queue()) {
            self.collectionView?.reloadData()
        }
    }
}

如何在Swift中使用NSPrivateQueueConcurrencyType之类的工具实现这一点

您的代码几乎肯定会失败。您正在从后台线程访问主托管对象上下文

从代码来看,似乎不需要后台获取。删除代码中的所有GCD(grand central dispatch)部分,您应该会没事的

以下是在核心数据中执行后台操作的方法,仅供参考:

let moc = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
moc.parentContext = <insert main context here>
moc.performBlock {
   // make changes, fetch, save
}
让moc=NSManagedObjectContext(并发类型:.PrivateQueueConcurrencyType)
moc.parentContext=
moc.performBlock{
//进行更改、提取、保存
}

保存后,主上下文将发生更改。要更新表视图,请实现
NSFetchedResultsController
及其委托方法来自动更新

你需要吗?fetc需要很长时间吗?为什么不使用“获取结果”控制器和“获取批量大小”!你所说的“使用获取结果控制器”和“获取批量大小”是什么意思?Google获取结果控制器(nsfetchedresultscontroller)但是如果我想用主上下文的数据更新我的子私有上下文的数据,我能做什么呢?我无法想象一个合理的使用案例。但是您可能可以通过
NSNotification
来实现。