Pet*_*rbo 6 cocoa asynchronous objective-c wait ios
我正在调用我想以同步顺序执行的四个方法,前两个方法是同步的,后两个方法是异步的(从URL获取数据).
伪代码:
- (void)syncData {
// Show activity indicator
[object sync]; // Synchronous method
[object2 sync]; // Synchronous method
BOOL object3Synced = [object3 sync]; // Async method
BOOL object4Synced = [object4 sync]; // Async method
// Wait for object3 and object4 has finished and then hide activity indicator
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
Jan*_*ano 25
使用障碍:
void dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
提交用于异步执行的屏障块并立即返回.
当屏障块到达专用并发队列的前面时,它不会立即执行.相反,队列等待,直到其当前正在执行的块完成执行.此时,队列自己执行屏障块.在屏障块完成之后,在屏障块之后提交的任何块都不会执行.
这个例子输出1 2 3 4 done虽然是异步的,但它可能是1 2 4 3 done.由于我了解您想要处理活动指标,这应该无关紧要.
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
@autoreleasepool {
dispatch_queue_t queue = dispatch_queue_create("com.myqueue", 0);
dispatch_sync(queue, ^(){NSLog(@"1");} );
dispatch_sync(queue, ^(){NSLog(@"2");});
dispatch_async(queue, ^(){NSLog(@"3");});
dispatch_async(queue, ^(){NSLog(@"4");});
dispatch_barrier_sync(queue, ^(){NSLog(@"done");});
}
}
Run Code Online (Sandbox Code Playgroud)
有关测试异步代码的其他方法,请参阅:https://stackoverflow.com/a/11179523/412916
假设你实际上有某种方式知道异步方法何时完成,你可能想要的是:
- (void)syncData {
// Show activity indicator
[object sync]; // Synchronous method
[object2 sync]; // Synchronous method
_object3Synced = _object4Synced = NO;
[object3 syncWithCompletionHandler:
^{
_object3Synced = YES;
[self considerHidingActivityIndicator];
}]; // Async method
[object4 syncWithCompletionHandler:
^{
_object4Synced = YES;
[self considerHidingActivityIndicator];
}]; // Async method
}
- (void)considerHidingActivityIndicator
{
if(_object3Synced && _object4Synced)
{
// hide activity indicator, etc
}
}
Run Code Online (Sandbox Code Playgroud)