it-swarm.com.de

Wie mache ich Multithreading, Parallelität oder Parallelität in iOS Swift?

Gibt es eine Möglichkeit, einen Arbeitsthread in Swift zu erstellen? Beispielsweise, wenn es eine Hauptfunktionalität gibt, die viele Berechnungen erfordert und daher eine Verzögerung des Hauptthreads um einige Sekunden verursacht, wenn ich diese Funktionalität auf ein verschieben möchte Separater Thread oder ein Thread, der den Haupt-Thread nicht blockiert. Gibt es eine Möglichkeit, dies mit Swift zu tun?

Ich habe die grundlegenden und erweiterten Komponenten der Apple Documentation for Swift) durchgearbeitet, aber es geht nicht um Parallelität oder Parallelität. Weiß jemand etwas darüber, wie es geht? es (wenn möglich)?

36
Martin Cazares

Oder Sie können auch Operationswarteschlangen verwenden. In Swift 3:

let queue = OperationQueue()

queue.addOperation() {
    // do something in the background

    OperationQueue.main.addOperation() {
        // when done, update your UI and/or model on the main queue
    }
}

Entweder das, oder GCD, was Andy illustriert , funktioniert gut.

In Apples Concurrency Programming Guide finden Sie die relativen Vorteile von Operationswarteschlangen und Dispatch-Warteschlangen (auch bekannt als Grand Central Dispatch, GCD). Während dieses Handbuch die Beispiele mit Objective-C noch veranschaulicht, sind API und Konzepte in Swift (verwenden Sie einfach die Swift) -Syntax) Die Dokumentation für GCD und Operationswarteschlangen in Xcode beschreibt sowohl Objective-C- als auch Swift APIs.


Übrigens, Sie werden feststellen, dass sowohl im obigen Beispiel als auch in Andys GCD-Demonstration "Trailing Closures" verwendet wurden. Wenn Sie sich beispielsweise die Definition addOperationWithBlock ansehen, die als Funktion mit einem Parameter definiert ist, der ein "Closure" ist (analog zu einem Block in Objective-C):

func addOperation(_ block: @escaping () -> Swift.Void)

Das könnte dazu führen, dass Sie davon ausgehen, dass Sie es folgendermaßen aufrufen würden:

queue.addOperation({
    // do something in the background
})

Wenn es sich bei dem letzten Parameter einer Funktion um einen Abschluss handelt, können Sie mit der nachgestellten Abschlusssyntax den letzten Abschlussparameter aus den Klammern der Funktion entfernen und nach der Funktion verschieben.

queue.addOperation() {
    // do something in the background
}

Und weil in den Klammern nichts mehr steht, können Sie noch einen Schritt weiter gehen und die leeren Klammern entfernen:

queue.addOperation {
    // do something in the background
}

Hoffentlich veranschaulicht dies, wie die Funktionsdeklarationen NSOperationQueue/OperationQueue und/oder GCD interpretiert und in Ihrem Code verwendet werden.

46
Rob

Für solche Aufgaben können Sie Grand Central Dispatch (GCD) verwenden.

Dies ist ein einfaches Beispiel:

let backgroundQueue: dispatch_queue_t = dispatch_queue_create("com.a.identifier", DISPATCH_QUEUE_CONCURRENT)

// can be called as often as needed
dispatch_async(backgroundQueue) {
    // do calculations
}

// release queue when you are done with all the work
dispatch_release(backgroundQueue)
17
Andy

Diese Bibliothek lässt Sie Parallelität auf eine sehr ausdrucksstarke Weise beschreiben:

func handleError(_ error) { ... }

HoneyBee.start(on: DispatchQueue.main) { root in
    root.setErrorHandler(handleError)
        .chain(function1) // runs on main queue
        .setBlockPerformer(DispatchQueue.global())
        .chain(function2) // runs on background queue
        .branch { stem in
            stem.chain(func3) // runs in parallel with func4
            +
            stem.chain(func4) // runs in parallel with func3
        }
        .chain(func5) // runs after func3 and func4 have finished
        .setBlockPerformer(DispatchQueue.main)
        .chain(updateUIFunc)
}
0
Alex Lynch