coredata学习总结(十五)

Concurrency

并发是在同一时间在多个队列中操作数据的能力。如果选择使用core data并发操作,你同样需要考虑应用程序的环境。appkit和uikit都不是线程安全的。特别是os x,如果你要使用这些技术,多线程可能会很复杂。

Core Data, Multithreading, and the Main Thread

core data,managed object context可以使用两种病发的形式。NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType.

NSMainQueueConcurrencyType主要应用于你的应用程序的interface并且只能用在主队列中。

NSPrivateQueueConcurrencyType创建自己的队列并且只能在其创建的队列中使用。因为队列是私有的并且是NSManagedObjectContext的内部实例,他只能通过performBlock:performBlockAndWait:方法来执行。

In both cases, the initialization of the NSManagedObjectContextinstance is the same:

  1. NSManagedObjectContext *moc = [[NSManagedObjectContextalloc] initWithConcurrencyType:<#type#>];
  1. let moc =NSManagedObjectContext(concurrencyType:<#type#>)

The parameter being passed in as part of the initialization will determine what type ofNSManagedObjectContext is returned.

Using a Private Queue to Support Concurrency

通常情况下,需要避免在主队列中执行数据操作。有可能导致用户交互无法响应。如果你的应用程序会操作数据,例如从json将数据import到core data,创建一个私有的队列context。例子如下:

  1. NSArray *jsonArray= ; //JSON data to be imported into Core Data
  2. NSManagedObjectContext *moc = ;//Our primary context on the main queue

  3. NSManagedObjectContext *private = [[NSManagedObjectContextalloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
  4. [privatesetParentContext:moc];

  5. [privateperformBlock:^{
  6. for (NSDictionary*jsonObject injsonArray) {
  7. NSManagedObject *mo = ;//Managed object that matches the incoming JSON structure
  8. //update MO with data from the dictionary
  9. }
  10. NSError *error= nil;
  11. if (![privatesave:&error]){
  12. NSLog(@"Error saving context: %@\n%@",[error localizedDescription],[error userInfo]);
  13. abort();
  14. }
  15. [moc performBlockAndWait:^{
  16. NSError *error= nil;
  17. if (![mocsave:&error]){
  18. NSLog(@"Error saving context: %@\n%@",[error localizedDescription],[error userInfo]);
  19. abort();
  20. }
  21. }];
  22. }];
  1. let jsonArray = …//JSON data to be imported into Core Data
  2. let moc = …//Our primary context on the main queue

  3. let privateMOC =NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
  4. privateMOC.parentContext =moc

  5. privateMOC.performBlock {
  6. for jsonObjectin jsonArray {
  7. let mo = …//Managed object that matches the incoming JSON structure
  8. //update MO with data from the dictionary
  9. }
  10. do {
  11. try privateMOC.save()
  12. moc.performBlockAndWait {
  13. do {
  14. try moc.save()
  15. } catch {
  16. fatalError("Failure to save context:\(error)")
  17. }
  18. }
  19. } catch {
  20. fatalError("Failure to save context:\(error)")
  21. }
  22. }

在这个例子中,数组接收json。然后你创建一个新的NSManagedObjectContext被定义为一个私有的队列。这个新的context被设置为应用程序运行的主队列的child。调用performBlock:并且执行NSManagedObject来创建。一旦所有的数据被转换为NSManagedObject实例,你可以在私有context中调用save,这会移除所有主队列上的改变而且不会block主队列。

Passing References Between Queues

NSManagedObject instances are not intended to be passed between queues. Doing so can result in corruption of the data and termination of the application. When it is necessary to hand off a managed object reference from one queue to another, it must be done throughNSManagedObjectID instances.

You retrieve the managed object ID of a managed object by calling theobjectID method on theNSManagedObject instance.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值