Diese Codezeile wird in meiner awakeFromFetch
Methode aufgerufen, die sich in einem benutzerdefinierten verwalteten Objekt befindet, das NSManagedObject
implementiert. Diese Zeile ruft insbesondere meine Singleton Network Manager-Klasse namens sharedManager
auf.Versand einmalig (dispatch_once) singleton friert/sperrt in Ziel c
[self setSync:(![[WKNetworkManager sharedManager] objectHasPendingRequests:self.objectID]) ];
Der dispatch_once Block wird wie unten gezeigt getroffen. Beachten Sie, dass es in einer guten Art und Weise durchgeführt wird, wie here gezeigt wird:
Der dispatch_once Anruf geht dann once.h und hier friert es rechts auf die markierte Zeile:
Hierist der Stack-Trace:
All dies geschieht, wenn Sie versuchen, eine zuvor gespeicherte Netzwerkwarteschlangendatei zu laden. Die Anwendung wird vollständig geschlossen, um zu speichern und dann erneut gestartet, und dann erfolgt das Einfrieren/Sperren.
Ich habe sogar versucht, diesen Code stattdessen zu verwenden, um das Problem zu lösen, wie es vorgeschlagen wird here, und es hat nicht funktioniert. Aber es wäre wahrscheinlich egal, dies zu ändern, da mein ursprünglicher dispatch_once-Code lange gut funktioniert hat. Es ist nur in diesem speziellen Fall.
if ([NSThread isMainThread])
{
dispatch_once(&onceToken, ^{
stack = [[KACoreDataStack alloc] init];});
}
else
{
dispatch_sync(dispatch_get_main_queue(), ^{
dispatch_once(&onceToken, ^{
stack = [[KACoreDataStack alloc] init];});
});
}
Bisher das sind meine Quellen für die Fehlersuche, diese Art von Problem:
- Code execution stops on using thread safe Singleton initialization code
- http://cocoasamurai.blogspot.jp/2011/04/singletons-your-doing-them-wrong.html
- http://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial
- ios singleton class crashes my app
- http://benalpert.com/2014/04/02/dispatch-once-initialization-on-the-main-thread.html
- http://www.bignerdranch.com/blog/dispatch_once-upon-a-time/
Danke für Ihre Hilfe!
Vielen Dank! Ich glaube, Sie haben etwas mit Architektur zu tun. Diese ganze Lade von der Disk-Sache wird hinzugefügt, nachdem die App entworfen wurde und offensichtlich spielt es nicht nett damit. WKNetworkManager (sharedManager) ruft '[self loadQueueFromDisk];'. Durch das Erzeugen der decodierten Objekte lösen diese Objektinitialisierungen wiederum Aufrufe von sharedManager aus. Das könnte sicherlich problematisch sein. Die verknüpfte Lösung sieht sperrig aus. Denken Sie, eine Block-Anweisung von loadQueueFromDisk zu erstellen, um die Aufgabe an einen anderen Thread zu delegieren? – Marcel
Wenn Sie die Frage mögen, upvote es! – Raspu
Nun, Core Data und Threading, das kann schnell kompliziert werden. Meine erste Neigung zur Kerndaten-Initialisierung ist, sie in die GCD-Warteschlange mit niedriger Priorität zu versetzen 'dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_LOW, 0),^{[self loadQueueFromDisk];}); so wird es einmal behandelt Warteschlangen mit hoher und normaler Priorität sind leer. Das ist wahrscheinlich das erwünschte Verhalten beim Start. –