我开始在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。
但令人惊讶的是,ParseItem1每次都会在ParseItem2之前被调用。即使_theService 1出现在_theService 2之前,也不确定原因。抱歉没有问题。
需要一些指导。
答案 0 :(得分:0)
您是否尝试更改要添加的NSOperation的优先级? 以下是NSOperation优先级属性的可能值: - NSOperationQueuePriorityVeryLow - NSOperationQueuePriorityLow - NSOperationQueuePriorityNormal - NSOperationQueuePriorityHigh - NSOperationQueuePriorityVeryHigh
如果您希望maxConcurrentOperationCount属性一次处理一个操作,则可能还需要将其设置为1。
另一个是您可以使用值_theService2设置_theService1的NSOperation的依赖项属性,以便_theService2在执行之前必须等待_theService1完成。
答案 1 :(得分:0)
这显然意味着item2首先被添加到队列中 然后是item1。
这个假设是错误的。 AFNetworking使用的NSOperationQueue不保证操作将按照添加顺序启动或完成。面对,在AFHTTPClient的init方法中,您可以看到:
self.operationQueue = [[NSOperationQueue alloc] init];
[self.operationQueue setMaxConcurrentOperationCount:NSOperationQueueDefaultMaxConcurrentOperationCount];
所以你的队列肯定会同时执行操作。
我不能说为什么在你的测试中总会发生这种反向调用,但我认为第二次调用要么更快返回,要么更快解析,或两者兼而有之。
无论如何,如果你需要两个操作都能成功返回解析,你可以使用enqueueBatchOfHTTPRequestOperations:progressBlock:completionBlock:
并且在完成所有操作之前不会调用完成块。或者您可以将一个操作设置为依赖于另一个操作(因为它是NSOperation子类。)