De l'utilisation de NSOperationQueue
Bonjour à tous,
Je me pose des questions quant aux possibilités qu'offre NSOperationQueue.
J'ai une liste d'image à charger, j'ajoute une NSOperation dans mon operationQueue une fois une Cell chargée dont l'image n'a pas déjà été récupérée.
J'ai limité le nombre d'opérations à la fois à 5.
J'ai voulu optimiser un peu pour éviter de rajouter une NSOperation à chaque fois. J'ai donc utilisé un NSPredicate afin de filtrer les NSOperation et récupérer celle dont le path de l'image à charger correspond à celui que je suis sur le point de devoir afficher :
Voilà donc un premier problème réglé.. cela m'empêche d'avoir autant de NSOperation que de Cell qui ont demandé à être affichées.
La dernière étape d'optimisation serait de changer la priorité des Opérations. C'est à dire que les Cell visibles doivent à tout prix prendre la priorité sur les anciennes, non visible, mais dont les NSOperations ont déjà été ajoutées et sont en cours.
Le problème se remarque surtout si on scroll rapidement en bas de la liste.. les images arrivent donc en dernier, malheureusement.
Apple dit aussi de ne pas modifier la priorité des NSOperation une fois ajoutées dans la Queue.
Y-a-t-il donc une subtilité que je n'aurai point notifié? À ce rythme là , je préfère à la limite me construire mon propre gestionnaire de Queue avec des NSThread... C'est plus risqué, mais plus flexible.
(Nb : c'est sur OS X)
Je me pose des questions quant aux possibilités qu'offre NSOperationQueue.
J'ai une liste d'image à charger, j'ajoute une NSOperation dans mon operationQueue une fois une Cell chargée dont l'image n'a pas déjà été récupérée.
J'ai limité le nombre d'opérations à la fois à 5.
J'ai voulu optimiser un peu pour éviter de rajouter une NSOperation à chaque fois. J'ai donc utilisé un NSPredicate afin de filtrer les NSOperation et récupérer celle dont le path de l'image à charger correspond à celui que je suis sur le point de devoir afficher :
<br />NSPredicate* pred = [NSPredicate predicateWithFormat:@"media.location like[c] %@", aMedia.location];<br />NSArray* filteredOperations = [[operationQueue operations] filteredArrayUsingPredicate:pred];<br />if(filteredOperations.count==0){ <br /> QLOperation* op = [[QLOperation alloc] initWithMedia:aMedia.location fromController:self];<br /> [operationQueue addOperation:op];<br /> [op release];<br />}<br />
Voilà donc un premier problème réglé.. cela m'empêche d'avoir autant de NSOperation que de Cell qui ont demandé à être affichées.
La dernière étape d'optimisation serait de changer la priorité des Opérations. C'est à dire que les Cell visibles doivent à tout prix prendre la priorité sur les anciennes, non visible, mais dont les NSOperations ont déjà été ajoutées et sont en cours.
Le problème se remarque surtout si on scroll rapidement en bas de la liste.. les images arrivent donc en dernier, malheureusement.
Apple dit aussi de ne pas modifier la priorité des NSOperation une fois ajoutées dans la Queue.
Y-a-t-il donc une subtilité que je n'aurai point notifié? À ce rythme là , je préfère à la limite me construire mon propre gestionnaire de Queue avec des NSThread... C'est plus risqué, mais plus flexible.
(Nb : c'est sur OS X)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Sinon, je ne sais pas, mais ce FW peut-il t'aider :
http://allseeing-i.com/ASIHTTPRequest/How-to-use
paragraphe :
Using a queue
+ methods delegate
Ou tu peux peut-être annuler toute la queue dans le cas d'un grand scroll ?
Oui je pourrai quand même utiliser ça, mais les images sont produites grace au framework QuickLook. Donc on oubli totalement NSURLConnection
Tu ne peux pas analyser la vitesse de scroll et ne charger les images que si elle est supérieure à une valeur arbitraire ?
Ou sinon dans les sessions WWDC sur les TableViews et les Scrollviews y'a peut-être des trucs là dessus, ils parlent pas mal de techniques d'optimisation.
Sinon y'a pas moyen de reprioriser les NSOperations genre en les enlevant de la queue puis en les remettant avec une nouvelle priorité (si on a pas le droit de changer la prio en live) ?
Concernant la priorité, il semblerait que la changer en live n'a aucun effet (de ce que j'ai lu sur des forums -- il faut que je test de mon côté)
Ce qu'il faut surtout éviter, c'est de modifier une NSOperation en cours d'execution.
Je pense revenir sur le problème un peu plus tard dans le projet, pour l'instant il y a des choses plus urgentes.
@muqaddar : ça fait quoi au juste dans iPhoto?