3

Ich muss die folgenden Operationen mit nsoperationqueue gleichzeitig durchführen.iOS - Parallelität beim Ausführen von 5 Operationen Hochladen von Bildern auf den Server mit NSOperationQueue, gefolgt von einer einzelnen Aufgabe in Objective-c

Ich muss zu einem Zeitpunkt mehrere Operationen im Hintergrund auszuführen, wie 5 (Hochladen Dateien auf Server), ich habe alle Warteschlangen zu verwalten, hängt bis zu Follow scenorio

  • 1) Netzwerk ist 2G nur durchführen 1 Betrieb, bleiben 4 Operationen sollte aufhören

  • 2) Netzwerk ist entweder 3G/Wifi führen alle Operationen parallel.

Wie erreiche ich das mit Objective-c ???

Vielen Dank im Voraus.

+0

können Sie auf diese Weise versuchen (Add Beobachter für Internet-Überwachung und machen den Umgang mit NSOperationQueue Operationen), https://stackoverflow.com/questions/30182128/upload-multiple-images-using-afnetworking –

+0

Sie verwenden können Erreichbarkeits Klasse @ https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html von Apple bereitgestellten oder Scheck zusammen mit Muttererreichbarkeits Klasse von Apple Implementierung tonymillion die individuellen Erreichbarkeits Klasse in dem Link erwähnte aus ebenfalls. https://stackoverflow.com/questions/17926026/objective-c-reachability-class –

+0

würde ich verwenden NSOperationQueue in diesem Anwendungsfall entmutigen. Um einen minimalen Nutzen daraus zu ziehen, müssen Sie - im Gegensatz zu anderen Ansätzen - eine gleichzeitige NSOperation-Unterklasse erstellen, die überraschend fehleranfällig und aufwendig ist. IMHO, Sie sind besser dran, nur asynchrone Funktionen aufrufen (mit einem Abschluss-Handler) und nutzen Sie eine 'DispatchGroup' (und' enter', 'Leave' und' notify' jeweils), um Ihre Netzwerkanforderungen zu serialisieren. Je größer die Nutzlast, desto geringer ist der Nutzen, den Sie durch die Parallelisierung der Anforderungen erzielen. – CouchDeveloper

Antwort

0

Ihren Internet-Status überprüfen und eine Operation behandeln als

Serien Versand Queues

In serieller Warteschlange erfordert jede Aufgabe für die vorherige Aufgabe wartet, bevor sie ausgeführt zu beenden.

Wenn das Netzwerk langsam ist, können Sie es verwenden.

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 
    }) 
} 

Concurrent Queue

Jeder Downloader ist als eine Aufgabe betrachtet und alle Aufgaben werden in der gleichen Zeit durchgeführt.

Wenn Netzwerk schnell verwenden Sie es.

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

Wenn Sie eine Operation müssen beginnen, die auf die Ausführung der anderen abhängig ist, werden Sie NSOperation verwenden.

Sie können auch eine Priorität für den Betrieb festlegen.

addDependency für verschiedene 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) 

können Sie auch

public enum NSOperationQueuePriority : Int { 
    case VeryLow 
    case Low 
    case Normal 
    case High 
    case VeryHigh 
} 

Sie auch einen gleichzeitigen Betrieb einstellen

queue = OperationQueue() 

queue.addOperation {() -> Void in 

    let img1 = Downloader.downloadImageWithURL(url: imageURLs[0]) 

    OperationQueue.main.addOperation({ 
     self.imgView1.image = img1 
    }) 
} 

Sie können auch abbrechen und beenden Betrieb eine Priorität gesetzt.

+0

Okay, ich werde es @ Priya konvertieren –

Verwandte Themen