Question

Is there a way to limit the bandwidth used by an NSURLConnection, or I'm forced to use CFNetwork methods?

Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top