0

Je télécharge un tas d'images et exécute un rappel après le téléchargement de toutes les. Pour ce faire, j'utilise dispatch_group API. Parce que la bibliothèque de cache que j'utilise a quelques bugs (ils ne la répareront pas de sitôt, changer n'est pas une option) Je suis en train de segmenter les opérations par lots (50 images, puis 50 autres images).Swift dispatch_group comportement étrange sur la fonction récursive

Le comportement va mal quand j'ajoute l'appel récursif:

dispatch_group_notify(downloadGroup, dispatch_get_main_queue()) { 

    // This works perfectly, get called ONCE after ALL images are downloaded  
    // finishedCallback?(images: images, errors: errors) 


    // This snippet doesn't work. I don't understand why but it gets called 
    // MULTIPLE times instead of once, like the like above 
    if (index + maxDownloadsPerRequest) >= Int(total) { 
     finishedCallback?(images: images, errors: errors) 
    } else { 
     self.callMyselfRecursively(#updatedIndex: index) 
    } 
} 

Toute idée de ce qui ne va pas avec mon code?

Répondre

0

Vous pouvez essayer barrière:

dispatch_queue_t queue = dispatch_queue_create("custom_queue", DISPATCH_QUEUE_CONCURRENT); 
dispatch_async(queue, ^{ 
    // download image here 
}); 

// call this line when you started all workers 
dispatch_barrier_sync(queue, ^{ 
    // do something then all workers finished 
}); 
+0

Si tout votre code est à l'intérieur ** A func() **, et j'appeler récursive ** self.A() ** à l'intérieur du bloc ** dispatch_barrier_sync * *, alors la fonction ne s'exécute pas correctement, c'est le bug que j'ai –

+0

Donc vous ne savez pas combien d'images vous devez télécharger et vous ne pouvez pas remplir la file d'attente avant dispatch_barrier_sync()? –

+0

Non. Le problème est que je dois télécharger 50 images pour 50 images, sinon la bibliothèque que j'utilise plante. Donc, une fois que les 50 premiers sont téléchargés, les 50 suivants commencent. C'est pourquoi j'appelle récursivement –