【问题标题】:Combine AFHTTPRequestOperation and NSBlockOperation (iOS)?结合 AFHTTPRequestOperation 和 NSBlockOperation (iOS)?
【发布时间】:2014-11-12 19:37:19
【问题描述】:

我想执行 2 个请求并在最后发送通知。我检查操作序列的代码:

AFHTTPRequestOperation *operation1 = ...;
AFHTTPRequestOperation *operation2 = ...;
[operation1 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

            NSLog(@"asdf");
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        }];
[operation2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

            NSLog(@"asdf");
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        }];
NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"123");
    }];
NSArray *operationArray = @[operation1, operation2, operation3];
for (int i = 1; i < operationArray.count; i++) {

        NSOperation *op = operationArray[i];
        [op addDependency:operationArray[i - 1]];
    }
[queue addOperations:ops waitUntilFinished:NO];

我希望得到以下控制台日志:

asdf
asdf
123

但实际结果是:

asdf
123
asdf

为什么?

【问题讨论】:

    标签: ios nsoperation nsoperationqueue afhttprequestoperation nsblockoperation


    【解决方案1】:

    来自文档

    无法保证完成块的确切执行上下文,但通常是辅助线程。因此,您不应使用此块来执行任何需要非常特定的执行上下文的工作。相反,您应该将该工作分流到应用程序的主线程或能够执行此操作的特定线程。例如,如果您有一个自定义线程来协调操作的完成,您可以使用完成块来 ping 该线程。

    即不要依赖在一个操作完成之后和另一个操作开始之前调用完成块,因为不能保证会这样。

    【讨论】:

    • 感谢您的描述。您能否提出一些解决此问题的建议 - 创建一个请求处理程序链/序列?
    • 不要将时间/顺序敏感逻辑添加到完成块中。如果您需要在 AFN 操作之间运行某些操作,则创建另一个操作并为其(及其上)设置依赖关系。
    • 我的问题是操作仅按定义的顺序执行。我需要以正确的顺序处理他们的结果。不过好吧,反正你已经回答了我的问题,谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-10-23
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 2012-06-16
    • 2014-02-07
    相关资源
    最近更新 更多