我在这个例子中使用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是否有办法对它们进行排队,以便每个人都可以等到块运行完毕?如果不是,我怎样才能重新设计完成这种依赖。
答案 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