首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dispatch_async(dispatch_get_main_queue() inside performBlock )

dispatch_async(dispatch_get_main_queue() inside performBlock )
EN

Stack Overflow用户
提问于 2014-11-26 21:29:34
回答 2查看 721关注 0票数 0

我想要做的是在后台线程上创建一个异步核心数据任务,这样就不会咀嚼主线程,但我也希望在完成工作后执行主线程工作。

这是我的任务

代码语言:javascript
复制
  -(void)doTaskwithCompletion:(coreDataCompletion)complete
  {
    [self.backgroundManagedObjectContext performBlock:^{

        // do my BG core data task

        [self saveContext:self.backgroundManagedObjectContext];
        complete(YES);

    }];
   }

这是我的块方法

代码语言:javascript
复制
            [[MYCoreDataManager sharedInstance]doTaskwithCompletion:^(BOOL complete) {

                if (complete == YES) {

                    dispatch_async(dispatch_get_main_queue(), ^{

                         // back to the main thread                            
                    });
                }

            }];

我觉得这是不对的..。但是我找不到其他方法让我自己回到主线程上了.通知似乎太笨重了。

我想简单地说,我的问题是我能在moc performBlock:^中调用moc performBlock:^吗?

本质上

代码语言:javascript
复制
  -(void)doTaskwithCompletion:(coreDataCompletion)complete
  {
    [self.backgroundManagedObjectContext performBlock:^{

        // do my BG core data task

        [self saveContext:self.backgroundManagedObjectContext];
        dispatch_async(dispatch_get_main_queue(), ^{

           // back to the main thread    

        });

    }];
   }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-26 21:42:16

“我想简单地说,我的问题是我能否调用dispatch_async(dispatch_get_main_queue()在moc执行块内:^?”

答案是肯定的!事实上,当您从主线程调用您的performBlock时,您正在执行相反的操作,对吗?这是iOS的一个共同特性。一种更干净的方法也许是通过一个完成,在这个完成中调用main.

现在,你有:

代码语言:javascript
复制
dispatch_async(dispatch_get_main_queue(), ^{

       // back to the main thread  
       completion()



    });

你也可以写:

代码语言:javascript
复制
-(void)doTaskwithCompletion:(coreDataCompletion)complete
{
[self.backgroundManagedObjectContext performBlock:^{

    // do my BG core data task

    [self saveContext:self.backgroundManagedObjectContext];
    complete()

}];
}

其中有一个对主线程的调用。

票数 2
EN

Stack Overflow用户

发布于 2014-11-26 21:51:01

我想您知道,调用某个异步并返回到mainQueue (即更新UI)是一种非常常见的模式:

代码语言:javascript
复制
dispatch_async(globalQueue, ^{
    // do something
    dispatch_async(mainQueue, ^{ 
        // update UI
    });
});

由于您已经将变量命名为self.backgroundManagedObjectContext,您可能具有多上下文CoreData的核心,我理解您的关切。只要您不试图用这个块来更改CoreData (在任何上下文上),您可能会很好。

只需确保对上下文使用正确的初始化器,即[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27159200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档