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.
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 –
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 –
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