处理块,完成处理程序,dispatch_async与dispatch_sync [英] Dealing with Blocks, completion handlers, dispatch_async vs dispatch_sync

查看:51
本文介绍了处理块,完成处理程序,dispatch_async与dispatch_sync的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在线程中执行在线数据获取,并且我想在执行块后立即执行某项操作.

I'm executing an online fetch of data in a thread and I want to do something immediately after the block is executed.

这是我的代码:

- (IBAction)refresh:(UIBarButtonItem *)sender {
    NSLog(@"checking");
    [self editToolbar];
    dispatch_queue_t fetchQ = dispatch_queue_create("Refreshing", NULL);
    dispatch_async(fetchQ, ^{
        [self setupFetchedResultsController];
        [self fetchImonggoItemsDataIntoDocument: self.itemDatabase];
    });
    dispatch_release(fetchQ); 

    NSLog(@"done checking");
    //do something here
}

事情是dispatch_async立即返回,并且即使在该块执行完毕之前,也会立即打印完成检查".我该如何解决?

The thing is dispatch_async returns immediately and "done checking" prints immediately even before the block is done executing. How do I solve this?

推荐答案

我认为这是一个体系结构问题.任务类似于:

I think it's an architectural issue. The tasks are something like:

  1. 编辑工具栏
  2. fetchImonggoItemsDataIntoDocument
  3. 做其他事情

如果必须按顺序正确完成这些操作,那么我对块或队列的使用不太了解.只需一个接一个地运行这些语句,您就会被设置.

If these must be done exactly in order then I don't quite understand the use of blocks or queues; just run the statements after each other and you'll be set.

否则,备选方案1是使用dispatch_sync而不是dispatch_async.再说一次,我不太确定使用队列的好处是什么,但是确实有.

Otherwise, alternative #1 would be to use dispatch_sync rather than dispatch_async. Again, I'm not quite sure what the benefit of using a queue would be but there it is.

替代方法2是使用该块中的回调.像这样:

Alternative #2 would be to use a callback from the block. Something like:

- (IBAction)refresh:(UIBarButtonItem *)sender {
    NSLog(@"checking");
    [self editToolbar];
    dispatch_queue_t fetchQ = dispatch_queue_create("Refreshing", NULL);
    dispatch_async(fetchQ, ^{
        [self setupFetchedResultsController];
        [self fetchImonggoItemsDataIntoDocument: self.itemDatabase];
        [self doneChecking]; // <-- NOTE! call the callback
    });
    dispatch_release(fetchQ); 
}

// NOTE! refresh: has been split up into two methods
- (void)doneChecking:
    NSLog(@"done checking");
    //do something here
}

这篇关于处理块,完成处理程序,dispatch_async与dispatch_sync的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆