ios – 等待许多异步调用来执行回调

ios – 等待许多异步调用来执行回调,第1张

概述我想与Web服务同步一些数据.对于每个项目,我必须进行异步调用. 当每个项目同步时,我想要调用一个完成块.对于每个项目,我能够执行完成块.现在,我不知道如何做到这一点的好方法. 这是界面: -(void) synchronizeItemsOnComplete:(CompleteBlock) block { NSArray* items = // get items for (int 我想与Web服务同步一些数据.对于每个项目,我必须进行异步调用.

当每个项目同步时,我想要调用一个完成块.对于每个项目,我能够执行完成块.现在,我不知道如何做到这一点的好方法.

这是界面:

-(voID) synchronizeItemsOnComplete:(CompleteBlock) block {    NSArray* items = // get items    for (int i = 0,n = [items count]; i < n; i++) {       [self synchronizeItem:[items objectAtIndex:i] onComplete:^{          // What do do here?       }];    }    // And/or here?}-(voID) synchronizeItemOnComplete:(CompleteBlock) block {    // do something    block();}

如何等待同步然后执行块?

我试过这样的事情:

NSArray* items = // get items__block int countOfItemsUntilDone = [items count];for (int i = 0,n = countOfItemsUntilDone; i < n; i++) {    [self synchronizeItem:[items objectAtIndex:i] onComplete:^{        countOfItemsUntilDone--;    }];}dispatch_queue_t queue = dispatch_queue_create("wait for syncing",disPATCH_QUEUE_CONCURRENT);dispatch_async(queue,^{    while (countOfItemsUntilDone > 0) {        usleep(1000); // wait a little bit    }    block();});dispatch_release(queue);

但我认为这是一个非常糟糕的方式.有任何想法吗?

解决方法 而不是在等待计数器等于零的循环中旋转,每次递减时检查计数器值,然后在达到零时触发事件.

-(voID) synchronizeItemsOnComplete:(CompleteBlock) block {    NSArray* items = // get items    __block NSUInteger remaining = [items count];    for (ItemClass* item in items) {       [self synchronizeItemImage:item onComplete:^{            --remaining;            if (remaining == 0) {                block();            }       }];    } }

要解释为什么它感觉不对,你在这里做的两件事你应该做或不做或很少:

>使用后台队列.这很难并容易出错.如果不仔细阅读有关编写并发代码的内容,请不要这样做.如果 *** 作阻塞了大量时间(例如,从磁盘读取文件或执行密集计算),您也只需要这样做.除非你有充分的理由(例如,可衡量的性能问题),否则不要假设你需要这样做.
>在循环中旋转,检查变量是否有变化并调用睡眠.你永远不应该这样做.

此外,如果您循环遍历数组中的元素,则for … in语法在每个索引上调用objectAtIndex:会更好(并且可能更有效).

总结

以上是内存溢出为你收集整理的ios – 等待许多异步调用来执行回调全部内容,希望文章能够帮你解决ios – 等待许多异步调用来执行回调所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1056730.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存