【问题标题】:Deleting an NSManagedObject in the Main Thread from an NSOperation从 NSOperation 中删除主线程中的 NSManagedObject
【发布时间】:2011-11-01 21:58:36
【问题描述】:

从 NSOperation 在主线程上的 NSManagedObjectContext 上调用 deleteObject: 时,我是否还需要在主线程上引用 objectID?目前我正在通过以下方式从 NSOperation 中删除主线程中的 NSManagedObject...

NSManagedObjectContext *mainContext = [[[UIApplication sharedApplication] delegate] managedObjectContext];

- (void)deleteObject:(NSManagedObjectID *)objectID
 {
     // Delete on main context on the main thread
     [mainContext performSelectorOnMainThread:@selector(deleteObject:)
                              withObject:[mainContext objectWithID:objectID]
                           waitUntilDone:YES];
 }

它正在工作,但我想确保它以后不会炸毁我。我不确定的是 [mainContext objectWithID:objectID] 是否从 NSOperation 引用 NSManagedObjectContext,或者由于该方法调用在 performSelectorOnMainThread:withObject:waitUntilDone: 内,是否全部在主线程上执行?

【问题讨论】:

    标签: core-data nsmanagedobject nsoperation nsmanagedobjectcontext


    【解决方案1】:

    NSManagedObjectID 的实例可以安全地跨线程边界共享。但是,您对 mainContext objectWithID: 的调用将获得实际对象,这不是线程安全的。

    您可能应该做的是将其包装在可以在主队列上执行的选择器或块中。

    dispatch_async(dispatch_get_main_queue(), ^{
        NSManagedObjectContext *mainContext = [[[UIApplication sharedApplication] delegate] managedObjectContext];
        NSManagedObject *obj = [mainContext objectWithID:objectID];
        if (obj) {
            [mainContext deleteObject:obj];
        }
    })
    

    或者,您可以让您的主线程队列为您执行此操作:

    [mainContext performBlock:^{
        NSManagedObject *obj = [mainContext objectWithID:objectID];
        if (obj) {
            [mainContext deleteObject:obj];
        }
    }]
    

    当然,所有这些都引出了一个问题,你为什么要尝试从另一个线程上的 NSOperation 实例中删除基于主线程的上下文中的对象?

    【讨论】:

    • 我正在使用您的第一种方法 (GCD)。谢谢!为了回答您的问题,我正在从我下载并在 NSOperation 中解析的 JSON 文件更新核心数据持久存储。我根据当前的持久存储 NSManagedObjects 检查 JSON 对象。如果持久存储包含不在 JSON 中的对象,我将删除 NSManagedObject。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多