2010-01-31 11 views
17

Kann ein Objective-C-Block mit NSKeyedArchiver codiert werden?Codierung eines Objective-c-Blocks?

Ich glaube nicht, ein Block-Objekt ist NSCoding-konform, daher funktioniert [coder encodeObject:block forKey:@"block"] nicht?

Irgendwelche Ideen?

Antwort

19

Nein, dies ist aus verschiedenen Gründen nicht möglich. Die Daten, die in einem Block enthalten sind, werden nicht in ähnlicher Weise wie zum Beispiel Instanzvariablen dargestellt. Es gibt kein Inventar des Staates und somit auch keine Möglichkeit, den Staat für Archivierungszwecke aufzuzählen.

Stattdessen würde ich vorschlagen, dass Sie eine einfache Klasse erstellen, um Ihre Daten zu speichern, deren Instanzen den Zustand der Blöcke während der Verarbeitung tragen und der einfach archiviert werden kann.

Sie könnten die Antwort zu diesem question interesting finden. Es ist verwandt.


zu erweitern, sagen Sie wie eine Klasse hatte:

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

- (void) doYourMagicMan; 
@end 

Dann könnten Sie:

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 Sie die Archivierung auf MyData implementieren könnte, speichern Sie sie weg, etc ... Der Schlüssel behandelt den Block als Auslöser für die Berechnung und kapselt diese Berechnung und den notwendigen Zustand der Berechnung in die Instanz der MyData-Klasse ein.

+0

Vielen Dank für die Antwort, ich denke, ich verstehe, warum es nicht einfach ist, sie einfach zu kodieren. Allerdings bin ich verwirrt über Ihren Vorschlag, eine Klasse zu verwenden, um den von Blöcken verwendeten Zustand zu halten. Wären Sie in der Lage, zu erweitern, wie das zu implementieren? In meiner Situation habe ich grundlegende leere Rückrufblöcke, d. H. Void^{do_stuff; }. Danke! – rebo

+0

Es ist kontraintuitiv, dass ein Block _ leicht eine Instanzvariable _... sein kann, aber nicht un/archiviert werden kann. Mit Contraintuitive, ich meine, _lame_. Upvoted für die einzige Antwort, mit der Einschränkung, dass ich denke, dass es tatsächlich einen Weg gibt ... irgendwie, irgendwo. –

+3

@alexgray Tonnen von Objekten können Instanzvariablen sein, die nicht archiviert/nicht archiviert werden können (jede Klasse, die NSCopying nicht unterstützt). Und was würde es sogar bedeuten, dass ein Block archivierbar ist? Müssten alle erfassten Objekte auch archivierbar sein? Was passiert, wenn eine zufällige Struktur erfasst wird? Muss ich das auch archivieren? Was ist mit Architektur/Endian Abhängigkeiten? Diese werden automatisch von den Archiver-APIs verarbeitet. Müssten Blöcke dann die Fähigkeit zur Implementierung einer benutzerdefinierten Archivierung erweitern? Abgesehen davon, dass es sich um einen Albtraum handelt, der zu warten ist, wäre das im Kit (mit wenig ROI) sehr schwer zu unterstützen. – bbum