当每个项目同步时,我想要调用一个完成块.对于每个项目,我能够执行完成块.现在,我不知道如何做到这一点的好方法.
这是界面:
-(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 – 等待许多异步调用来执行回调所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)