3

Je dois effectuer les opérations ci-dessous en utilisant nsoperationqueue simultanément.iOS - Concurrence effectuant 5 opérations de téléchargement d'images sur le serveur à l'aide de NSOperationQueue suivi d'une seule tâche dans Objective-c

je dois effectuer plusieurs opérations en arrière-plan à un moment comme 5 (Transfert fichiers vers le serveur), je dois gérer toutes les files d'attente dépend sur le suivi scenorio

  • 1) réseau est 2G seulement effectuer 1 Opération, restant 4 opérations devrait être d'arrêter

  • 2) réseau est soit 3G/Wifi effectuer toutes les opérations parallèlement.

Comment puis-je réaliser cela en utilisant Objective-c ???

Merci d'avance.

+0

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 –

+0

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 –

+0

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

Répondre

0

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.

+0

Ok je vais le convertir @Priya –