Is there a way to limit the bandwidth used by an NSURLConnection, or I'm forced to use CFNetwork methods?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
Yes, but it's not pretty (it works according to this mailing list post):
- Start NSURLConnection on a background thread (you'll have to set up a run loop).
- Sleep in
-connection:didReceiveData:
. - Forward your data to the main thread in a thread-safe fashion.
The third bulletpoint is a little tricky to get right if the delegate is a UIViewController
, but something like this should work provided delegate
is __weak
or __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];
}
Calculating how long to sleep for is non-trivial because you may wish to account for TCP/IP overheads, but [data length]+100
may be about right.
If you have multiple connections and you want to throttle the combined bandwidth, put them all on the same background thread/run loop (see -performSelector:onThread:withObject:waitUntilDone:
).
For the CFNetwork version, I'm guessing you've read this post on Cocoa with Love.