3

NSURLConnection Asynchronous リクエストの使用に関する優れたチュートリアルを探しています。私はstackoverflowとGoogleで探し回っていましたが、見つかりませんでした。これは、このような無数の質問の複製である可能性があります。ただし、正しいチュートリアルに誘導してください。以前に ASIHTTPRequest を使用したことがありますが、Apple が提供するライブラリは使用したことがありません。

4

1 に答える 1

6

私は自分で書いたものを提供しますが、AFNetworkingを使用することを強くお勧めします。これは、よりクリーンなフローを持つ NSURLConnection / NSURLRequest システムの上のラッパーです。これで基本的な NSURLRequests / Connections を通常の NSOperationQueues と共に使用することもできます。ライブラリはココアポッドも使用していますが、正直なところ、それほどきれいにはなりません。

NSOperationQueue *mainQueue = [[NSOperationQueue alloc] init];
[mainQueue setMaxConcurrentOperationCount:5];

NSURL *url = [NSURL URLWithString:@"http://192.168.0.63:7070/api/Misc/GetFuelTypes"];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

[request setHTTPMethod:@"GET"];
[request setAllHTTPHeaderFields:@{@"Accepts-Encoding": @"gzip", @"Accept": @"application/json"}];

[NSURLConnection sendAsynchronousRequest:request queue:mainQueue completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) {
    NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response;
    if (!error) {
        NSLog(@"Status Code: %li %@", (long)urlResponse.statusCode, [NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode]);
        NSLog(@"Response Body: %@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]);
    }
    else {
        NSLog(@"An error occured, Status Code: %i", urlResponse.statusCode);
        NSLog(@"Description: %@", [error localizedDescription]);
        NSLog(@"Response Body: %@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]);
    }
}];

mainQueue オブジェクトは、リクエストのルーティングと一度に送信できる数の管理に使用されます。これはさまざまな方法で使用できます。私はそれらを分類されたリクエスト (認証、メイン、アップロード キュー) に使用する傾向があります。

ブロック内に入ると、返された応答を使用してローカル NSHTTPURLResponse を構築します。これは、ステータス コードを返す場合に必要です。(標準の NSURLResponse オブジェクトには存在しません)

responseData は、通常、文字列に変換したり、デシリアライザーを実行して人間が読み取れるデータを取得したりできるデータです。

非常に簡単な説明です。同じオブジェクトからの複数のリクエストを管理する方法がわからない場合、デリゲートは問題を引き起こします(おそらく、私がブロックを好む理由です):-)

いつものデリゲートやブロックと同様に、応答を受け取った後に UI を更新するようにトリガーしたいが、要求が完了するのを待つ必要はありません。データをテーブルにロードしている場合は、ロード時に要求を呼び出して何らかのフォームを提供します。データが受信されたら、hud を削除してテーブル データをリロードします。HUD はメイン スレッドで呼び出す必要があるため、必ずそれを処理する必要があります。通常は拡張機能をビルドして performSelectorOnMainThread を使用しますが、より良い方法は、関数を dispatch_async でラップし、hud show / hide コードを外部で呼び出すことです。それ。

于 2013-02-15T20:01:45.300 に答える