后台线程中的Coredata CRUD操作?

时间:2017-10-23 18:38:19

标签: objective-c core-data nsmanagedobject nsmanagedobjectcontext

我在应用程序中使用Apple的以下代码片段创建/更新 NSManagedObject

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Add code here to do background processing
    //
    //

NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        [private setParentContext:mainMoc];

        [private performBlock:^{
            for (NSDictionary *jsonObject in jsonArray) {
                NSManagedObject *mo = …; //Managed object that matches the incoming JSON structure
                //update MO with data from the dictionary
            }
            NSError *error = nil;
            if (![private save:&error]) {
                NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
                abort();
            }
            [mainMoc performBlockAndWait:^{
                NSError *error = nil;
                if (![mainMoc save:&error]) {
                    NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
                    abort();
                }
            }];
        }];




    dispatch_async( dispatch_get_main_queue(), ^{
        // Add code here to update the UI/send notifications based on the
        // results of the background processing
    });
});

我有两个疑问

  1. 只需使用上面的代码从我的模型中读取值,

    [private performBlock:^{}); 是必需的吗?

  2. 在后台线程中有没有更好的创建/更新操作方法。我是否使用最佳方法进行上述操作?
  3. 提前致谢

1 个答案:

答案 0 :(得分:1)

来自Apple的文档Concurrency

  

performBlock:performBlockAndWait:确保在为上下文指定的队列上执行块操作。 performBlock:方法立即返回,上下文在其自己的线程上执行块方法。使用performBlockAndWait:方法,上下文仍在其自己的线程上执行块方法,但该方法在块执行之前不会返回。

使用NSPrivateQueueConcurrencyType时,上下文会创建并管理专用队列。

因此,如果使用performBlock:,则不需要创建另一个调度队列,因为它在块内异步执行操作。否则,如果你使用performBlockAndWait:等待完成它的操作执行,在这种情况下你应该使用另一个调度队列。

因此,最佳做法是避免使用另一个调度队列。 e.g

NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[private setParentContext:mainMoc];

[private performBlock:^{
    for (NSDictionary *jsonObject in jsonArray) {
        NSManagedObject *mo = …; //Managed object that matches the incoming JSON structure
        //update MO with data from the dictionary
    }
    NSError *error = nil;
    if (![private save:&error]) {
        NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
        abort();
    }
    [mainMoc performBlockAndWait:^{
        NSError *error = nil;
        if (![mainMoc save:&error]) {
            NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
            abort();
        }
    }];
}];