繁体   English   中英

在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM