2017-01-22 1 views
3

Verwenden von Swift 3 in Xcode 8.2.1 für eine iOS App.Benötige ich einen Autorespulepoolblock innerhalb einer DispatchQueue.main.async

Ich verstehe, dass ich einen Autoreleasepool-Block brauche, wenn ich eine Verarbeitung für einen neuen Thread absetze. Aber wird es benötigt, wenn man auf den Haupt-Thread zurückschickt?

Angenommen, wir auf dem Hauptthread sind und wie folgt vorgehen:

DispatchQueue.global(qos: .background).async { 
     autoreleasepool { 
      //***** do something in the background 
     } // autoreleasepool 

     DispatchQueue.main.async { 
      //***** do something on the main thread when background job is done 
      //***** does this something need to be enclosed in an autoreleasepool block ? 
     } // DispatchQueue.main.async 

    } // DispatchQueue.global 

Antwort

2

Sie schaffen keine neuen Threads GCD (dispatch Familie von Funktionen). Dies sind bereits vorhandene Systemwarteschlangen, für die Sie keine zusätzlichen Autorelease-Pools benötigen.

Wenn Sie manuell sind NSThread oder Thread in Swift verwenden, dann würden Sie darüber Sorgen machen müssen, aber dies in der Regel für die Sie nicht brauchen noch relativ weit fortgeschritten Hintergrundverarbeitung.

+0

das klingt für mich vernünftig, aber es gab so viele Beispiele rund um das Netz, die Autorespulepool-Blöcke enthalten ... Also, wenn ich es gut verstehe, ist der erste Autorespulepool in meinem Beispiel auch nicht notwendig. Ist das korrekt ? – KerCodex

+0

Dies ist nicht einmal mehr für 'NSThread' oder sogar Pthreads erforderlich. http://StackOverflow.com/a/30519746/97337 Und natürlich ist es auch nicht für Warteschlangen erforderlich, die Sie erstellen (also nicht nur vom System erstellte Warteschlangen). Sie müssen jetzt nur dann Autorespulepools erstellen, wenn Sie eine Menge temporärer Objekte erstellen möchten, deren Lebensdauer Sie steuern möchten (normalerweise, um Speicherspitzen aufgrund von Schleifen zu vermeiden). –

+0

Ja, richtig. Es wird nicht benötigt – Alistra

Verwandte Themen