iOS   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了iphone – 处理块,完成处理程序,dispatch_async和dispatch_sync大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在线程中执行数据的在线提取,我想在块执行后立即执行某些操作. 这是我的代码: - (IBACtion)refresh:(UIBarButtonItem *)sender { NSLog(@"checking"); [self editToolbar]; dispatch_queue_t fetchQ = dispatch_queue_create("refreshing
我正在线程中执行数据的在线提取,我想在块执行后立即执行某些操作.

这是我的代码

- (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立即返回,并且即使在块执行完毕之前,“完成检查”也会立即打印.我该如何解决这个问题?

解决方法

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

>编辑工具栏
> fetchImonggoItemsDataIntoDocument
>做点别的事

如果这些必须完全按顺序完成,那么我不太了解块或队列的使用;只需在彼此之后运行语句就可以了.

否则,替代方案#1将使用dispatch_sync而不是dispatch_async.同样,我不太确定使用队列的好处是什么,但它确实如此.

备选方案#2将使用来自块的回调.就像是:

- (IBACtion)refresh:(UIBarButtonItem *)sender {
    NSLog(@"checking");
    [self editToolbar];
    dispatch_queue_t fetchQ = dispatch_queue_create("refreshing",^{
        [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
}

大佬总结

以上是大佬教程为你收集整理的iphone – 处理块,完成处理程序,dispatch_async和dispatch_sync全部内容,希望文章能够帮你解决iphone – 处理块,完成处理程序,dispatch_async和dispatch_sync所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。