NSOperation等待依赖完成成功块

时间:2014-08-23 01:14:49

标签: ios afnetworking nsoperation nsoperationqueue

我在这个例子中使用AFNetworking,但我认为它更适用于NSOperation。我有两个操作,一个是依赖于其他整理。然而,op2确实不应该运行,直到op1的成功块完全运行。对于操作队列中的依赖项,op2将在op1完成后立即运行,但在op1的成功块完成之前就会运行。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSURLRequest *request = [manager.requestSerializer requestWithMethod:@"GET" URLString:url parameters: nil error: nil];
NSOperation *op1 = [http.manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id userLocations) {
   NSLog(@"Success");
   // do some stuff 

   // more stuf

   // I am done, ready for the next operation.
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
   NSLog(@"Error: %@", error);
}];
NSOperation* op2 = // create op, this will depend on op1 finishing
[op2 addDependency:Op1];  // op2 is dependent on op1 finishing

[manager.operationQueue addOperations:@[op1, op2] waitUntilFinished:NO];

这对我来说不太有用,因为op2依赖于op1的成功块中设置的一些东西。意味着op2无法启动,直到op1完成其成功块。

NSOperations是否有办法对它们进行排队,以便每个人都可以等到块运行完毕?如果不是,我怎样才能重新设计完成这种依赖。

2 个答案:

答案 0 :(得分:1)

我会稍微改变一下结构,在第一个操作中设置第二个操作。像这样:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSURLRequest *request = [manager.requestSerializer requestWithMethod:@"GET" URLString:url parameters: nil error: nil];
NSOperation *op1 = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id userLocations) {
    NSLog(@"Success");
    // do some stuff

    // more stuf

    // I am done, ready for the next operation.
    // SO put the other operation here!
    NSOperation* op2 = // create op, this will depend on op1 finishing

    [manager.operationQueue addOperation:op2];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
[manager.operationQueue addOperation:op1];

答案 1 :(得分:0)

我遇到了同样的问题,仅使用[operationQueue setSuspended:YES]就找到了一个很好的解决方案,请参阅本文的第二个答案:NSOperation wait until asynchronous block executes