Viele Menschen haben eine Frage mit einem ähnlichen Titel gefragt, aber ganz anderen Zweck:dispatch_get_current_queue() veraltet, gibt es eine Alternative für sichere CoreData?
Coredata erfordert, dass Sie den Überblick über Ihre aktuelle Warteschlange zu halten, Ihren aktuellen Thread, und Ihre aktuelle NSOperationQueue (wenn Sie eine NSOperation sind) , wenn Sie zulassen, dass Methodenaufrufe von anderen Klassen kommen (was standardmäßig jede Klasse zulässt). Es gibt keine "maybes" darüber: Es ist eine harte Anforderung.
ist das in Ordnung, und es ist in der Regel leicht zu gewährleisten:
NSAssert([NSThread currentThread].isMainThread || myPrivateQueue == dispatch_get_current_queue(), @"You tried to call this method from an external thread, or a queue other than my internal private queue. That's not legal, and will cause data corruption");
... außer, dass Apple gegangen und veraltete dispatch_get_current_queue() hat, anscheinend „, weil die Menschen mißbrauchten es um Funktionalität in GCD fehlt zu erhalten/Bits von GCD haben sie nicht verstanden ".
NB: meine Nutzung von dispatch_get_current_queue() oben erscheint korrekt und nicht missbräuchlich zu sein, die Beurteilung durch Apples Header-Kommentar: Der springende Punkt ist, dass ich überprüfe, dass die Warteschlange der privaten I erstellt (die Ansprüche von Apple ist eine akzeptable Nutzung).
Abgesehen von der Weisheit, etwas zu verwerfen, einfach aufgrund von Fehlern in der Implementierung :(... hat jemand eine Abhilfe gefunden, die von Apple entfernt wurde. Speziell: mit CoreData müssen Sie die Warteschlange verfolgen - gibt es eine andere
(Das ist wichtig, weil: Wenn Sie mit CoreData erlauben, dass etwas versehentlich eine solche Methode aufruft, werden Sie keinen "Absturz" bekommen, Sie werden "Daten korrumpieren" bekommen, die bei erscheinen werden . Irgendwann in der Zukunft, wenn es zu spät ist, es zu beheben ")
Ich habe 'dispatch_queue_set_specific()' und 'dispatch_get_specific()' verwendet, für die Anwendung, die ich hier gefragt habe: http://stackoverflow.com/questions/12806506/how-can-i-verify-that- Ich bin am Laufen-auf-gegeben-gcd-Queue-ohne-Verwendung-dispatch-g und es hat gut funktioniert, um bestimmte Warteschlangen zu identifizieren. Der Kommentar von Jody zu der Antwort erwähnt die Verwendung von etwas ähnlichem in Core Data. –
@BradLarson dispatch_get_specific() ist sehr interessant, danke. Ich bin mir nicht sicher, was passiert, wenn du es nennst, wenn du nicht in einem Block bist (in korrekter Ausführung, würdest du sein), aber ich würde gerne wissen, was passiert, wenn es schief geht, denn das ist das Setup, das ich versuche zu fangen/behaupten/loggen gegen) – Adam
Ich weiß nicht, dass das in einem Block von Bedeutung ist. Alles, was es testet, ist ein Schlüssel, der der bestimmten Warteschlange zugewiesen ist, auf der dieser Code ausgeführt wird. Wie ich dort zeige, verwende ich dies für eine Funktion, die die synchrone Ausführung von Code in einer bestimmten Warteschlange garantiert, indem entweder ein Block synchron an die Warteschlange gesendet wird oder indem der Code direkt ausgeführt wird, wenn er bereits in dieser Warteschlange ist. –