2

私のアプリでは、JSONを返す2つのWebサービスに接続する必要があります。

私は最初にGCDを使用して独自のネットワークコードをロールしましたが、AFNetworkingがどのように処理するかを見て、それを実装することにしました。ほとんどのことがうまくいきましたが、ある時点で、オブジェクトで満たされた2つの配列を取得しています。次に、これら2つのアレイは、異なる方法を使用して比較されます。どういうわけか、実際のエンキューは、使用しているコードに応じて、遅延するか、機能しません。

使用する場合:

NSArray *operations = [NSArray arrayWithObjects:operation, operation1, nil];
        AFHTTPClient *client = [[AFHTTPClient alloc]init];

        [client enqueueBatchOfHTTPRequestOperations:operations progressBlock:nil completionBlock:^(NSArray *operations) {
            [self compareArrays:self];
        }

ハングするだけです。

使用する場合:

 [operation start];
    [operation1 start];
    [operation waitUntilFinished];
    [operation1 waitUntilFinished];

    [self compareArrays:self];

最後に、配列を取得しますが、UIが形成された後にのみ比較します。

編集:私はデイブの答えをチェックしました、そしてそれは本当に合理化されたように見えます。私のアプリはを使用することでメリットがありますかAFHTTPClient、それともこの方法(を使用してAFJSONRequestOperation)は同じ機能を提供しますか?到達可能性を自分で処理することを今思い出しAFHTTPClientます(設定する必要がありますが)。私は少しいじって、これを機能させました:

NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    WebServiceStore *wss = [WebServiceStore sharedWebServiceStore];
    self.userData = wss.userData;
    serviceURL = [NSString stringWithFormat: @"WEBSERVICE URL"];
    NSString* zoekFruit = [NSString stringWithFormat:
                           @"%@?customer=%@&gebruiker=%@&password=%@&breedte=%@&hoogte=%@&diameter=%@",
                           serviceURL,
                           self.userData.Klant,
                           self.userData.Gebruiker,
                           self.userData.Wachtwoord,
                           breedte,
                           hoogte,
                           diameter];

    NSURL *url = [NSURL URLWithString:[zoekFruit stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];

        NSURLRequest *request = [NSURLRequest requestWithURL:url];

        AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
            id results = [JSON valueForKey:@"data"];

            [results enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

                //Initiate the BWBand

                BWBand *band = [[BWBand alloc]init];

                //Set the BWBand's properties with valueforKey (or so).                    

                [getBandenArray addObject:band];
            }];

            NSLog(@"getBandenArray: %@",getBandenArray);

        } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Error retrieving Banden" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
            [alert show];
        }];

       [queue addOperation:operation];
4

1 に答える 1

4

AFNetworkingクラスを使用すると、一連の操作を作成し、それらをすべて渡して処理することができます。個々のリクエストの成功/失敗時、および/またはすべてのリクエストが処理されたときに発生するコードを追加します。

これがあなたがするかもしれないことの概要です。詳細、実際の比較、エラー処理はあなたの想像に任せます。:)

-(void)fetchAllTheData {
    NSMutableArray * operations = [NSMutableArray array];
    for (NSString * url in self.urlsToFetchArray) {
        [operations addObject:[self operationToFetchSomeJSON:url]];
    }
    AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:[PREFS objectForKey:@"categoryUrlBase"]]];
    [client enqueueBatchOfHTTPRequestOperations:operations
                                  progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
                                      NSLog(@"Finished %d of %d", numberOfFinishedOperations, totalNumberOfOperations);
                                  }
                                completionBlock:^(NSArray *operations) {
                                    DLog(@"All operations finished");
                                    [[NSNotificationCenter defaultCenter] postNotificationName:@"Compare Everything" object:nil];
                                }];
}

-(AFHTTPRequestOperation *)operationToFetchSomeJSON:(NSString*)whichOne {
    NSURL * jsonURL = [NSURL URLWithString:whichOne];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:jsonURL];
    [request setHTTPShouldHandleCookies:NO];
    [request addValue:@"application/json" forHTTPHeaderField:@"Accept"];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"My data = %@", operation.responseString); // or responseData
        // Got the data; save it off.
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        DLog(@"Error downloading: %@  %@", whichOne, error);
    }];
    return operation;
}

お役に立てば幸いです。

于 2013-01-22T19:22:58.473 に答える