2010-11-03 10 views

Odpowiedz

27

NSURLRequest tylko udaje żądanie, a nie rzeczywiste połączenia.

zdarzenia dotykowe takie jak przewijanie umieści przebieg pętla do NSEventTrackingRunLoopMode. domyślnie każdy NSURLConnection zaplanowano tylko wykonać w NSDefaultRunLoopMode. Tak więc, w NSEventTrackingRunLoopMode, NSDefaultRunLoopMode jest zablokowany.

Dobrą wiadomością jest to, że można zaplanować dodatkowe tryby dla danej NSURLConnection, takie jak NSRunLoopCommonModes.

connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 
[connection start]; 
+0

Dzięki za ten ... uratował mnie ogromny ból głowy! :-) Jaka jest różnica między NSEventTrackingRunLoopMode a NSRunLoopCommonModes? – jowie

+1

AFAIK, połączenie, które jest zaplanowane w NSRunLoopCommonModes będą monitorowane przez wszystkich prowadzonych pętli. Jeśli był zaplanowany w NSEventTrackingRunLoopMode, to byłby monitorowany tylko wtedy, gdy są zdarzenia dotykowe. http://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSRunLoop_Class/Reference/Reference.html#//apple_ref/doc/uid/20000321-CJBJABGH – tidwall

1

Mam zorientowali się w bolesny sposób, że jeśli wywołanie startImmediately: TAK lub ommit tego parametru druga linia jest całkowicie bezużyteczne. Pamiętaj więc, aby postępować zgodnie ze wzorem dostarczonym przez @tidwall.

Tutaj również szybki przykład:

self.connection = NSURLConnection(request: self.request, delegate: self, startImmediately:false) 
self.connection?.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes) 
self.connection?.start()