Limit NSURLConnection data rate? (Bandwidth thrott

2019-02-19 22:34发布

问题:

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.