2010-11-03 56 views
13

J'ai un problème en essayant de charger en arrière-plan un fichier son pendant que l'utilisateur se déplace sur un UIScrollView ... Le problème est que j'utilise NSURLRequest pour pouvoir charger l'arrière-plan, mais même alors, il refuse de charger réellement jusqu'à ce que UIScrollView a cessé de défiler. :(NSURLRequest ne se déclenche pas lorsque UIScrollView fait défiler

Est-ce que je peux faire?

Merci!

Répondre

27

Le NSURLRequest ne gère que la demande, et non pas la connexion réelle.

événements tactiles telles que le défilement placeront la course boucle dans NSEventTrackingRunLoopMode. Par défaut, un NSURLConnection est prévu à que surExécuterdans NSDefaultRunLoopMode. Ainsi, alors que dans NSEventTrackingRunLoopMode, NSDefaultRunLoopMode est bloqué.

Bonne nouvelle est que vous pouvez planifier des modes supplémentaires pour un NSURLConnection, tels que NSRunLoopCommonModes.

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

Merci pour cette ... m'a sauvé un énorme mal de tête! :-) Quelle est la différence entre NSEventTrackingRunLoopMode et NSRunLoopCommonModes? – jowie

+1

AFAIK, une connexion planifiée dans NSRunLoopCommonModes sera surveillée par toutes les boucles d'exécution. S'il était planifié dans NSEventTrackingRunLoopMode, il ne serait surveillé que s'il y a des événements tactiles. http://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSRunLoop_Class/Reference/Reference.html#//apple_ref/doc/uid/20000321-CJBJABGH – tidwall

1

J'ai compris la dure que si vous appelez startImmediately: OUI ou OMMISSIONS ce paramètre deuxième ligne est tout à fait inutile. Assurez-vous donc de suivre le modèle exact fourni par @tidwall.

est ici aussi un exemple rapide:

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