2012-11-09 34 views

回答

1

是的,但它不是漂亮(被this mailing list post作品):

  • 开始NSURLConnection的后台线程(你必须建立一个运行循环)。
  • 睡在-connection:didReceiveData:
  • 以线程安全的方式将数据转发到主线程。

第三bulletpoint是有点棘手得到的权利,如果该委托是UIViewController,而应工作提供了这样的事情delegate__weak__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]; 
} 

计算多久的是睡觉不重要,因为你可能希望考虑TCP/IP开销,但[data length]+100可能是正确的。

如果您有多个连接并且想要限制组合带宽,请将它们全部放在相同的后台线程/运行循环中(请参阅-performSelector:onThread:withObject:waitUntilDone:)。

对于CFNetwork版本,我猜你已阅读this post on Cocoa with Love

+0

哇,谢谢你的惊人答案!正如你所说的那样,这不太好,但我会试着看看它是否可靠工作,如果不是,我会坚持使用CFNetwork。再次感谢你! –

+0

@tc NSURLConnection方法并没有真正限制下载速度,而是会降低数据在本地缓冲区的存储速度!我们不能限制传递给'-connection:didReceiveData:'方法的数据。我们是否可以限制从socket读取的数据,该数据以某种方式传递给'-connection:didReceiveData:'? – bikram990

+0

@ bikram990我希望它能在同一个线程中执行read()和'-connection:didReceiveData:'。如果没有,那么我会看看ASIHttpRequest或AFNetworking是否支持速率限制;也可能不难为其添加支持。 –