我有多个操作(它们是AFNetworking请求),带有需要一些时间才能执行的完成块,以及一个需要在所有请求结束时保存的核心数据对象.

MyCoreDataObject *coreDataObject;

AFHTTPRequestOperation *operation1 = [[AFHTTPRequestOperation alloc] initWithRequest:request1];
[operation1 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    coreDataObject.attribute1 = responseObject;
    sleep(5);
}];
[operation1 start];

AFHTTPRequestOperation *operation2 = [[AFHTTPRequestOperation alloc] initWithRequest:request1];
[operation2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    coreDataObject.attribute2 = responseObject;
    sleep(10);
}];
[operation1 operation2];

[context save:nil];

当然,这并不是我想要的那样,因为请求是异步的.我try 添加一个NSOperationQueue,如下所示:

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue setMaxConcurrentOperationCount:2];

AFHTTPRequestOperation *operation1 = [[AFHTTPRequestOperation alloc] initWithRequest:request1];
[operation1 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    coreDataObject.attribute1 = responseObject;
    sleep(5);
}];
[operationQueue addOperation:operation1];

AFHTTPRequestOperation *operation2 = [[AFHTTPRequestOperation alloc] initWithRequest:request1];
[operation2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    coreDataObject.attribute2 = responseObject;
    sleep(10);
}];
[operationQueue addOperation:operation2];

[imageQueue waitUntilAllOperationsAreFinished];
[context save:nil];

看起来好多了.使用waitUntilAllOperationsAreFinished,我的队列将阻塞当前线程,直到我的请求完成,但直到我的成功块完成,这才是我真正需要的.

关于如何以一种好的方式实现这一点,有什么 idea 吗?

推荐答案

使用调度组.

dispatch_group_t group = dispatch_group_create();

MyCoreDataObject *coreDataObject;

dispatch_group_enter(group);
AFHTTPRequestOperation *operation1 = [[AFHTTPRequestOperation alloc] initWithRequest:request1];
[operation1 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    coreDataObject.attribute1 = responseObject;
    sleep(5);
    dispatch_group_leave(group);
}];
[operation1 start];

dispatch_group_enter(group);
AFHTTPRequestOperation *operation2 = [[AFHTTPRequestOperation alloc] initWithRequest:request1];
[operation2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    coreDataObject.attribute2 = responseObject;
    sleep(10);
    dispatch_group_leave(group);
}];
[operation2 start];

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_release(group);

[context save:nil];

Objective-c相关问答推荐

MKMapView 上的 UIPanGestureRecognizer?

使用 UIScrollView 用两根手指滚动

Objective-C 浮点舍入

改变 setContentOffset:animated: 的速度?

在运行时判断 iOS 版本?

iOS NSLayoutConstraint 使用 constraintWithItem 固定宽度

Objective-C - 何时使用touch

如何在情节提要场景中嵌入自定义视图 xib?

了解按位与运算符

Electron邮件镇静 iOS 8

Objective-C 中的 super 到底是什么?

通过索引访问 NSMutableDictionary 中的对象

计算 UILabel 文本大小

检测 UITableView 滚动

Objective-C 中的同步和异步调用与多线程有什么区别?

如何将 tintColor 应用于 UIImage?

iPhone如何在打字时获取UITextField的文本?

将自定义子视图(在 xib 中创建)添加到视图控制器的视图 - 我在做什么错

带有 UIImage 的 UIBarButtonItem 始终着色 iOS 7

如何将按钮放在不会在 iOS 中随表格滚动的 UITableView 上