2012-11-09 35 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是否支持速率限制;也可能不難爲其添加支持。 –