どこを見ても、明示的にキューまたは実行ループを使用してネットワーク操作を行っている人々を見かけます。iOS 5 でもそれを行うべきですか、それともNSURLConnection sendAsynchronousRequest:queue:completionHandler:
代わりに使用する必要がありますか? これは iOS >= 5 でネットワーク操作を行うための推奨される方法ですか?
4 に答える
他人の好みにはお答えできませんが、自分はOS5以下で、ブロック操作を強く好みます。a) ネットワーク操作の中間結果や、それらを処理するための反復的なコードにはまったく関心がありません。b) ブロックが保持されるため、デリゲートの一部の側面が時期尚早に解放されるという競合状態が少なくなります。c) 私は特定の操作が終了したときに実行されているコードについて混乱することはありません。
要するに、これは NSURLConnection インターフェースである IMO の大幅な改善です。
場合によります。単純なことについては、新しいブロックベースの API により、作業がずっと簡単になります。ただし、メソッドを実装する場合と比較して、NSURLConnectionDelegate
制御がいくらか失われます。
たとえば、このメソッドで開始された接続をキャンセルしたり、すべてのデータがダウンロードされる前に応答 (ヘッダーの解析など) を処理したりすることはできません。
GCD を使用して、iOS 4 でも同様のことができます。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
NSData *data = [NSURLConnection sendSynchronousRequest:blah returningResponse:response error:blah];
//process response body here
dispatch_async(dispatch_get_main_queue(), ^{
//Update UI Code here
self.textView.text = [[NSString alloc] initWithData:data];
});
});
このコードと投稿されたコード OP の問題は、接続が確立されると、それらをキャンセルできないことです。viewDidDisappear でリクエストをキャンセルすると、アプリケーションのパフォーマンスが大幅に向上します。これについては、本iOS PTLで詳しく説明しています。
MKNetworkKit や RestKit などのサード パーティのネットワーク フレームワーク、または現在は廃止された ASIHTTP が必要な 2 番目の理由は、認証のためです。ほとんどの Web サービスでは、NSURLCredential (HTTP Basic または HTTP Digest または Windows NTLM または oAuth) を使用して認証する必要があります。
独自のコードを展開する場合、これだけでも数日かかります。してはいけないというわけではありません。しかし、これらのサード パーティ フレームワークはすべて広く使用されており、それらのフレームワークで発生する可能性やバグ、パフォーマンスの問題は、独自のコードに比べて少ないため、必要はありません。