1. ホーム
  2. objective-c

[解決済み] 複数の非同期NSURLConnection接続を管理する

2023-04-17 03:17:27

質問

私のクラスには、次のような繰り返しのコードがあります。

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
                                                              delegate:self];

非同期リクエストの問題は、さまざまなリクエストが発生し、それらをすべて1つのエンティティとして扱うためにデリゲートが割り当てられたとき、多くの分岐と醜いコードが形成され始めることです。

どのようなデータが返ってくるのか?

どのようなデータが返ってくるのか?これらの非同期リクエストにタグを付けることができれば、IDでビューをタグ付けできるのと同じように便利だと思います。

複数の非同期リクエストを処理するクラスを管理するために、どのような戦略が最も効率的であるかに興味がありました。

どのように解決するのですか?

私は、それに関連付けられた NSURLConnection によってキーが付けられた CFMutableDictionaryRef で応答を追跡しています。

connectionToInfoMapping =
    CFDictionaryCreateMutable(
        kCFAllocatorDefault,
        0,
        &kCFTypeDictionaryKeyCallBacks,
        &kCFTypeDictionaryValueCallBacks);

NSMutableDictionaryの代わりにこれを使うのは奇妙に思えるかもしれませんが、NSDictionaryがキーをコピーするのに対し、このCFDictionaryはキー(NSURLConnection)だけを保持するのでそうします(そしてNSURLConnectionはコピーをサポートしません)。

それが終わると

CFDictionaryAddValue(
    connectionToInfoMapping,
    connection,
    [NSMutableDictionary
        dictionaryWithObject:[NSMutableData data]
        forKey:@"receivedData"]);

そして今、私は各接続のためのデータの "info" 辞書を持っていて、接続に関する情報を追跡するのに使用することができます。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSMutableDictionary *connectionInfo =
        CFDictionaryGetValue(connectionToInfoMapping, connection);
    [[connectionInfo objectForKey:@"receivedData"] appendData:data];
}