Enrico Ghirardi
Enrico Ghirardi

Reputation: 33

Limit NSURLConnection data rate? (Bandwidth throttling)

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

Upvotes: 2

Views: 2319

Answers (1)

tc.
tc.

Reputation: 33592

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.

Upvotes: 1

Related Questions