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の前に呼び出されます。_theService1が_theService2の前にある場合でも。理由はわかりません。noobの質問でごめんなさい。

いくつかのガイダンスが必要です。

4

2 に答える 2

0

追加する NSOperation の優先度を変更しようとしましたか? 以下は、NSOperation 優先度プロパティの可能な値です。 - NSOperationQueuePriorityVeryLow - NSOperationQueuePriorityLow - NSOperationQueuePriorityNormal - NSOperationQueuePriorityHigh - NSOperationQueuePriorityVeryHigh

一度に 1 つの操作を処理する場合は、maxConcurrentOperationCount プロパティを 1 に設定することもできます。

もう 1 つの方法は、_theService1 の NSOperation の依存関係プロパティに値 _theService2 を設定して、_theService2 が実行される前に _theService1 が終了するまで待機する必要があるようにすることです。

于 2013-02-21T05:27:40.923 に答える
0

これは明らかに、item2 が最初にキューに追加され、その後に item1 が追加されることを意味します。

この仮定は間違っています。AFNetworking で使用される NSOperationQueue は、追加した順序で操作が開始または終了されることを保証しません。実際、AFHTTPClient の init メソッドでは、次のことがわかります。

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

したがって、キューは確実に操作を同時に実行します。

テストでこの逆呼び出しが常に発生する理由はわかりませんが、2 番目の呼び出しは、返すのが速いか、解析するのが速い、またはその両方であると思います。

とにかく、両方の操作を正常に解析するために返す必要がある場合は、使用できenqueueBatchOfHTTPRequestOperations:progressBlock:completionBlock:、完了ブロックはすべて完了するまで呼び出されません。または、ある操作を別の操作に依存するように設定できます (これは NSOperation サブクラスであるため)。

于 2013-02-21T15:13:44.233 に答える