Frage

Ist es möglich, einen Objektiv-C-Block mit einem zu codieren? NSKeyedArchiver?

Ich glaube nicht, dass ein Blockobjekt ist NSCoding-Compliant, deshalb [coder encodeObject:block forKey:@"block"] funktioniert nicht?

Irgendwelche Ideen?

War es hilfreich?

Lösung

Nein, es ist aus verschiedenen Gründen nicht möglich. Die in einem Block enthaltenen Daten sind in keiner Weise wie beispielsweise Instanzvariablen dargestellt. Es gibt keinen Inventar des Staates und daher keine Möglichkeit, den Staat für Archivzwecke aufzuzählen.

Stattdessen würde ich vorschlagen, dass Sie eine einfache Klasse erstellen, um Ihre Daten zu halten, von denen Instanzen den von den Blöcken während der Verarbeitung verwendeten Zustand tragen und die leicht archivieren können.

Möglicherweise finden Sie die Antwort darauf Frage interessant. Es ist verwandt.


Um zu erweitern, sagen Sie, Sie hatten eine Klasse wie:

@interface MyData:NSObject
{
    ... ivars representing work to be done in block
}

- (void) doYourMagicMan;
@end

Dann könntest du:

MyData *myWorkUnit = [MyData new];

... set up myWorkUnit here ...

[something doSomethingWithBlockCallback: ^{ [myWorkUnit doYourMagicMan]; }];

[myWorkUnit release]; // the block will retain it (callback *must* Block_copy() the block)

Von dort aus können Sie die Archivierung auf mydata implementieren, es wegsparen usw. Der Schlüssel ist der Block als Auslöser für die Berechnung und die Einkapselung dieser Berechnung und den erforderlichen Zustand der Berechnung in die Instanz der MyData -Klasse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top