Vérifiez votre Internet et gérer une opération nécessitent
série Dispatch Queues
Dans la file d'attente série chaque tâche attend la tâche précédente avant d'être exécuté.
Lorsque le réseau est lent, vous pouvez l'utiliser.
let serialQueue = dispatch_queue_create("com.imagesQueue", DISPATCH_QUEUE_SERIAL)
dispatch_async(serialQueue) {() -> Void in
let img1 = Downloader .downloadImageWithURL(imageURLs[0])
dispatch_async(dispatch_get_main_queue(), {
self.imageView1.image = img1
})
}
dispatch_async(serialQueue) {() -> Void in
let img2 = Downloader.downloadImageWithURL(imageURLs[1])
dispatch_async(dispatch_get_main_queue(), {
self.imageView2.image = img2
})
}
concurrente Queue
Chaque téléchargeur est considéré comme une tâche et toutes les tâches sont exécutées en même temps.
Lorsque le réseau l'utilise rapidement.
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(queue) {() -> Void in
let img1 = Downloader.downloadImageWithURL(imageURLs[0])
dispatch_async(dispatch_get_main_queue(), {
self.imageView1.image = img1
})
}
dispatch_async(queue) {() -> Void in
let img2 = Downloader.downloadImageWithURL(imageURLs[1])
dispatch_async(dispatch_get_main_queue(), {
self.imageView2.image = img2
})
}
NSOpration
Lorsque vous avez besoin pour démarrer une opération qui dépend de l'exécution de l'autre, vous voulez utiliser NSOperation.
Vous pouvez également définir une priorité de fonctionnement.
addDependency
pour différentes operation
queue = OperationQueue()
let operation1 = BlockOperation(block: {
let img1 = Downloader.downloadImageWithURL(url: imageURLs[0])
OperationQueue.main.addOperation({
self.imgView1.image = img1
})
})
// completionBlock for operation
operation1.completionBlock = {
print("Operation 1 completed")
}
// Add Operation into queue
queue.addOperation(operation1)
let operation2 = BlockOperation(block: {
let img2 = Downloader.downloadImageWithURL(url: imageURLs[1])
OperationQueue.main.addOperation({
self.imgView2.image = img2
})
})
// Operation 2 are depend on operation 1. when operation 1 completed after operation 2 is execute.
operation2.addDependency(operation1)
queue.addOperation(operation2)
Vous pouvez également définir une priorité
public enum NSOperationQueuePriority : Int {
case VeryLow
case Low
case Normal
case High
case VeryHigh
}
Vous pouvez également définir une opération simultanée
queue = OperationQueue()
queue.addOperation {() -> Void in
let img1 = Downloader.downloadImageWithURL(url: imageURLs[0])
OperationQueue.main.addOperation({
self.imgView1.image = img1
})
}
vous pouvez également annuler et opération de finition.
Vous pouvez essayer cette façon (Ajouter observateur pour la surveillance Internet et faire la gestion des opérations NSOperationQueue), https://stackoverflow.com/questions/30182128/upload-multiple-images-using-afnetworking –
Vous pouvez utiliser Classe d'accessibilité fournie par apple @ https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html ou consultez la classe d'accessibilité personnalisée de tonymillion mentionnée dans le lien avec la classe d'accessibilité native de l'implémentation Apple aussi. https://stackoverflow.com/questions/17926026/objective-c-reachability-class –
Je déconseillerais d'utiliser NSOperationQueue dans ce cas d'utilisation. Afin de tirer un avantage minuscule de son utilisation - contrairement à d'autres approches, vous devez créer une sous-classe NSOperation concurrente, qui est étonnamment propice aux erreurs et complexe. À mon humble avis, il vaut mieux simplement appeler des fonctions asynchrones (avec un gestionnaire de complétion) et exploiter un 'DispatchGroup' (et' enter', 'leave' et' notify' respectivement) pour sérialiser vos demandes de réseau. Plus la charge utile est grande, moins vous bénéficiez de la parallélisation des demandes, de toute façon. – CouchDeveloper