![](/img/trans.png)
[英]Adding NSOperation dependencies to operations already in an NSOperationQueue
[英]Adding operations in NSOperationQueue
我开始在iOS中的NSOperationQueue上面临一些我想阐明的基本问题。
这是我正在使用的代码:
-(void) SendRequestWithURL:(NSString*) URL andParam:(id) attributes {
[[AFNetworkActivityIndicatorManager sharedManager] incrementActivityCount];
_m_singleton = [Singleton sharedSingleton];
_parser = [[Syncparser alloc]init];
NSString *strServURL = [NSString stringWithFormat:@"%@%@",_m_singleton.globalstrURLLink,URL];
if (_theService == Item0 || _theService == Item1 || _theService == Item2){
NSLog(@"Entrance _theService %i", _theService);
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:strServURL]];
[client postPath:@"POST" parameters:attributes
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"_theService %i", _theService);
switch (_theService) {
case Item0: {
[_m_singleton.globalQueue addOperationWithBlock:^{
NSLog(@"ParseItem0 %@", [operation responseString]);
[_parser ParseItem0:[operation responseString]];
}];
}
break;
case Item1:{
[_m_singleton.globalQueue addOperationWithBlock:^{
NSLog(@"ParseItem1 %@", [operation responseString]);
[_parser ParseItem1:[operation responseString]];
}];
}
break;
case Item2:{
[_m_singleton.globalQueue addOperationWithBlock:^{
NSLog(@"ParseItem2 %@", [operation responseString]);
[_parser ParseItem2:[operation responseString]];
}];
}
break;
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}
}
我只叫item1和item2,这些是我在调试器中得到的值。
Entrance _theService 1
Entrance _theService 2
_theService 2
_theService 1
显然,这意味着item2首先添加到队列中,然后是item1。
但令人惊讶的是,每次都在ParseItem2之前调用ParseItem1。 即使_theService 1在_theService 2之前。也不知道为什么。 对不起,菜鸟问题。
需要一些指导。
您是否尝试过更改要添加的NSOperation的优先级? 以下是NSOperation优先级属性的可能值:-NSOperationQueuePriorityVeryLow-NSOperationQueuePriorityLow-NSOperationQueuePriorityNormal-NSOperationQueuePriorityHigh-NSOperationQueuePriorityVeryHigh
如果希望它一次处理一个操作,则可能还需要将maxConcurrentOperationCount属性设置为1。
另一个是,您可以将_theService1的NSOperation的依赖项属性设置为_theService2,以便_theService2在执行之前必须等待_theService1完成。
显然,这意味着item2首先添加到队列中,然后是item1。
这个假设是错误的。 AFNetworking使用的NSOperationQueue不保证操作将按照添加顺序开始或完成。 表面上,在AFHTTPClient的init方法中,您可以看到:
self.operationQueue = [[NSOperationQueue alloc] init];
[self.operationQueue setMaxConcurrentOperationCount:NSOperationQueueDefaultMaxConcurrentOperationCount];
因此,您的队列肯定会同时执行操作。
我不能说为什么这个反向调用总是在您的测试中发生,但是我认为第二个调用要么返回更快,要么解析更快,或者两者都更快。
无论如何,如果您需要同时执行这两项操作才能成功返回解析,则可以使用enqueueBatchOfHTTPRequestOperations:progressBlock:completionBlock:
并且在完成所有操作之前,不会调用完成块。 或者,您可以将一个操作设置为依赖于另一个操作(因为它是NSOperation子类。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.