NSURLConnectionによって使用される帯域幅を制限する方法はありますか、またはCFNetworkメソッドを使用することを余儀なくされていますか?
質問する
2156 次
1 に答える
1
はい、しかしそれはきれいではありません (このメーリングリストの投稿に従って動作します):
- バックグラウンド スレッドで NSURLConnection を開始します (実行ループを設定する必要があります)。
- で寝
-connection:didReceiveData:
ます。 - スレッドセーフな方法でデータをメイン スレッドに転送します。
3 番目の箇条書きは、デリゲートが の場合、正しく理解するのが少し難しいですが、またはUIViewController
があれば、次のようなものが機能するはずdelegate
です。__weak
__unsafe_unretained
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[NSThread sleepForTimeInterval:...];
[self performSelectorOnMainThread:@selector(notifyDelegateDidReceiveData:) withObject:data waitUntilDone:NO];
}
-(void)notifyDelegateDidReceiveData:(NSData*)data
{
assert([NSThread isMainThread]);
[delegate myConnectionWrapper:self didReceiveData:data];
}
TCP/IP のオーバーヘッドを考慮したい場合があるため、スリープする時間を計算するのは簡単ではあり[data length]+100
ませんが、ほぼ正しいかもしれません。
複数の接続があり、結合された帯域幅を調整したい場合は、それらすべてを同じバックグラウンド スレッド/実行ループに配置します ( を参照-performSelector:onThread:withObject:waitUntilDone:
)。
CFNetwork バージョンについては、Cocoa with Love に関するこの投稿を読んだことがあると思います。
于 2012-11-09T19:10:46.427 に答える