Limit NSURLConnection data rate? (Bandwidth throttling)

前端 未结 1 1285
粉色の甜心
粉色の甜心 2021-01-15 12:47

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

1条回答
  •  傲寒
    傲寒 (楼主)
    2021-01-15 13:07

    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.

    0 讨论(0)
提交回复
热议问题