Is there a way to limit the bandwidth used by an NSURLConnection, or I\'m forced to use CFNetwork methods?
Yes, but it's not pretty (it works according to this mailing list post):
-connection:didReceiveData:
.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.