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 :
<br />NSPredicate* pred = [NSPredicate predicateWithFormat:@&quot;media.location like[c] %@&quot;, 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)

Réponses

  • muqaddarmuqaddar Administrateur
    septembre 2010 modifié #2
    Est-ce qu'il est judicieux d'utiliser une NSOperationQueue dans un tel contexte ? (celui de pouvoir scroller à  la fin rapidement par exemple) ?

    Sinon, je ne sais pas, mais ce FW peut-il t'aider :
    http://allseeing-i.com/ASIHTTPRequest/How-to-use

    paragraphe :

    Using a queue

    This example does the same thing again, but we've created an NSOperationQueue for our request.

    Using an NSOperationQueue (or ASINetworkQueue, see below) you create yourself gives you more control over asynchronous requests. When using a queue, only a certain number of requests can run at the same time. If you add more requests than the queue's maxConcurrentOperationCount property, requests will wait for others to finish before they start.


    + methods delegate

    Ou tu peux peut-être annuler toute la queue dans le cas d'un grand scroll ?

    [queue cancelAllOperations];
    
  • septembre 2010 modifié #3
    Je charge des images en local, sinon je n'utiliserai sûrement pas de thread alors que NSURLConnection est asynchrone.

    Oui je pourrai quand même utiliser ça, mais les images sont produites grace au framework QuickLook. Donc on oubli totalement NSURLConnection
  • muqaddarmuqaddar Administrateur
    19:44 modifié #4
    ok, ok.

    Tu ne peux pas analyser la vitesse de scroll et ne charger les images que si elle est supérieure à  une valeur arbitraire ?
  • AliGatorAliGator Membre, Modérateur
    19:44 modifié #5
    Je te conseille de regarder les exemples LazyTableViewImages d'Apple pour t'en inspirer de ce côté.
    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) ?
  • muqaddarmuqaddar Administrateur
    19:44 modifié #6
    EN fait, il veut un peu faire comme la liste de photos dans iPhoto ?
  • 19:44 modifié #7
    @Ali : je connais l'exemple d'Apple par coeur  :D C'est surtout orienté iPhone.. la scrollView aide énormément, et sur Mac il ne semble y avoir aucune notifications de scroll (Il faut que je vérifie tout de même tiens...)
    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?
Connectez-vous ou Inscrivez-vous pour répondre.