Heute habe ich ein seltsames Problem gefunden, als ich versuchte, meine CoreData-Importoperationen zu "generalisieren".
Es scheint, dass wenn ich eine generische Unterklasse von NSOperation erstelle, der main()
func nicht aufgerufen wird.
Einfaches Beispiel:
%Vor% Wenn Sie eine Instanz dieser Klasse erstellen und zu operationQueue
hinzufügen, sehen Sie, dass main()
nicht wirklich aufgerufen wird.
Der Vorgang wird einfach von ready
nach executing
und in den Zustand finished
umgeleitet, ohne dass main()
aufgerufen wird.
Wenn ich die generische Annotation <T: NSObject>
von MyOperation
class lösche, funktioniert es gut.
Wie ist das möglich? Fehle ich hier etwas?
Das Problem wird durch diese einfache Regel verursacht:
Methode in einer generischen Klasse kann nicht in Objective-C
dargestellt werden
Dies führt dazu, dass MyOperation
bei der Überbrückung zu Objective-C wie rein aussieht und keine Methoden außer Kraft gesetzt werden, NSOperation
subclass.
Sie können diesen Fehler sehen, indem Sie override func main()
mit @objc
attribute markieren.
Problemumgehung: Sie können NSOperation-Unterklasse (kein generisches) erstellen, main überschreiben und Sie eigene 'execute' -Funktion aufrufen, die von generischen Unterklassen überschrieben werden kann. Beispiel:
%Vor%In Xcode 7 wurde die generische NSOperation korrigiert: Wenn ich diesen Code auf einem Spielplatz ausführe, funktioniert es:
%Vor%Tags und Links nsoperation nsoperationqueue generics swift