2

NSURLConnectionによって使用される帯域幅を制限する方法はありますか、またはCFNetworkメソッドを使用することを余儀なくされていますか?

4

1 に答える 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 に答える