0

我开始使用 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 之前。不知道为什么。对不起菜鸟问题。

需要一些指导。

4

2 回答 2

0

这显然意味着 item2 首先被添加到队列中,然后是 item1。

这个假设是错误的。AFNetworking 使用的 NSOperationQueue 不保证操作将按照您添加它们的顺序开始或完成。面对面,在AFHTTPClient的init方法中,可以看到:

self.operationQueue = [[NSOperationQueue alloc] init];
[self.operationQueue setMaxConcurrentOperationCount:NSOperationQueueDefaultMaxConcurrentOperationCount];

因此,您的队列肯定会同时执行操作。

我不能说为什么这个反向调用总是在你的测试中发生,但我认为第二个调用要么更快地返回,要么更快地解析,或者两者兼而有之。

无论如何,如果您需要这两个操作才能成功返回解析,您可以使用enqueueBatchOfHTTPRequestOperations:progressBlock:completionBlock:完成块,直到它们全部完成。或者您可以将一个操作设置为依赖于另一个操作(因为它是 NSOperation 子类。)

于 2013-02-21T15:13:44.233 回答
0

您是否尝试过更改要添加的 NSOperation 的优先级?以下是 NSOperation 优先级属性的可能值: - NSOperationQueuePriorityVeryLow - NSOperationQueuePriorityLow - NSOperationQueuePriorityNormal - NSOperationQueuePriorityHigh - NSOperationQueuePriorityVeryHigh

如果您希望一次处理一个操作,您可能还希望将 maxConcurrentOperationCount 属性设置为 1。

另一个是您可以将 _theService1 的 NSOperation 的依赖属性设置为 _theService2 值,以便 _theService2 在执行之前必须等待 _theService1 完成。

于 2013-02-21T05:27:40.923 回答