0

サーバーへの非同期 (笑) 呼び出しを行う Objective-c コードがありますが、よくわかりません。サーバーから返される応答を処理する正しい方法は何ですか?

私はこのようなことをします:

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];

    // ***************
    // TODO: ok I dont really understand what this is
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // **************

    [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
     {         
      ...

また、私は Objective-C に非常に慣れていないため、オブジェクトから値を取得する方法や、NSData または NSResponse オブジェクトを処理する方法をどこで確認すればよいかさえわかりません。

サーバーが時々 JSON 応答を返したり、時には "ok" のような文字列だけを返したりすることを知っています

また、私の混乱に加えて、このチュートリアルがあります:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

それによると、次のようないくつかの個別の機能が必要です

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

また

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

だから私の質問は、リクエストから3つの変数(エラー、レスポンス、データ)から基本的な返されたデータを取得する方法と、私が言及したチュートリアルが示唆するメソッドをいつ実装する必要があるかということです. チュートリアルにははるかに洗練された解決策があるようです...しかし、やり過ぎかどうかはわかりません。

4

1 に答える 1

3

エラー

NSError には (特にブロック内で) ユニークな小さな機能があり、変数とそのアドレスが引数 (この場合は単純な NSError*) として渡されると、メソッドはオブジェクトを変更し、場合によっては使用可能なインスタンスを返すことが期待されます。エラーの。エラーが発生しない通常の使用例では、これは である必要がnilあり、ブロックの完了ハンドラー部分内でログに記録できます。

[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
(     iferror)
         NSLog(@"Connection Error - %@", [error localizedDescription]);
}];  

応答

あなたの場合、 NSURLResponse は重要ではありません。Apple は次のように述べています。

注: NSURLResponse オブジェクトには、URL のコンテンツを表す実際のバイトは含まれません。URL ロードのコンテンツ データの受信について詳しくは、NSURLConnection を参照してください。

ファイルのダウンロードには NSURLResponse を使用しますが、それだけです。JSON はNSURLConnectionオブジェクトによって返されます。


データ

おそらく、取引全体の中で最も重要な部分です。JSON 応答はこのデータ内に含まれます。つまり、JSON 値から実際の ObjC オブジェクトを取得できるように、文字列に変換してからインタープリターに送信する必要があります。JSON FrameworkJSONKitTouchJSONなど、広く使用されているいくつかのクラスが構築されました。


ところで、NSOperationQueueはスレッド プールによく似ていますが、管理の役割を果たします。NSOperationQueue オブジェクトは NSOperation オブジェクトに送信され、内部キューに追加され、NSOperationQueue オブジェクトによっても管理されるスレッドで実行されます。iOS 4.x での GCD の出現を考慮すると、これらは基本的に役に立たなくなりましたが、レガシー ソフトウェア サポートの場合は、非同期 (または送信された操作でisConcurrentプロパティが設定されているかどうかに応じて同期) タスクを実行するのに役立ちます。バックグラウンド スレッド。

于 2012-07-08T23:28:42.350 に答える