在NSOperationQueue中添加操作

时间:2013-02-21 03:35:21

标签: ios afnetworking 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。

但令人惊讶的是,ParseItem1每次都会在ParseItem2之前被调用。即使_theService 1出现在_theService 2之前,也不确定原因。抱歉没有问题。

需要一些指导。

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子类。)