2010-01-31 16 views
17

¿Es posible codificar un bloque Objective-C con un NSKeyedArchiver?¿Cómo codificar un bloque Objective-c?

No creo que un objeto Block sea NSCoding -compliant, por lo tanto [coder encodeObject:block forKey:@"block"] no funciona?

¿Alguna idea?

Respuesta

19

No, no es posible por varias razones. Los datos contenidos dentro de un bloque no están representados de ninguna manera similar a, por ejemplo, variables de instancia. No hay inventario de estado y, por lo tanto, no hay forma de enumerar el estado para fines de archivo.

En su lugar, le sugiero que cree una clase simple para contener sus datos, cuyas instancias llevan el estado utilizado por los bloques durante el procesamiento y que pueden archivarse fácilmente.

Puede encontrar la respuesta a este question interesting. Es relacionado.


Para ampliar, decir que tenía una clase como:

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

- (void) doYourMagicMan; 
@end 

Entonces usted podría:

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) 

A partir de ahí, se puede aplicar el archivo de MyData, salvar a la basura, etc. ... La clave es tratar el Bloque como el disparador para hacer el cálculo y encapsular dicho cálculo y el estado necesario del cálculo en la instancia de la clase MyData.

+0

Gracias por la respuesta, creo que entiendo por qué no es sencillo simplemente codificarlos. Sin embargo, estoy confundido acerca de su sugerencia de utilizar una clase para mantener el estado utilizado por los bloques. ¿Sería capaz de ampliar sobre cómo implementar eso? En mi situación tengo bloques de devolución de llamada básicos vacíos, es decir, vacío^{do_stuff; }. Gracias! – rebo

+0

Es contra intuitivo que un bloque _puede ser una variable de instancia _... pero que no pueda ser un/archivado. Por contra intuitivo, quiero decir, _lame_. Upvoted por ser la única respuesta, con la advertencia de que SIEMPRE hay una manera ... de alguna manera, en alguna parte. –

+3

@alexgray Toneladas de objetos pueden ser variables de instancia que no se pueden archivar/desarchivar (cada clase que no admite NSCopying). ¿Y qué significaría que un bloque sea archivable? ¿Deberían todos los objetos capturados también ser archivables? ¿Qué pasa si captura una estructura aleatoria? ¿Tengo que archivar eso también? ¿Qué pasa con las dependencias arquitectura/endian? Esas son manejadas automáticamente por las API del archivador. ¿Los bloques tendrían que desarrollar la capacidad de implementar un archivo personalizado? Más allá de ser una pesadilla para mantener, sería muy difícil mantenerlo en el kit (con poco retorno de la inversión). – bbum

Cuestiones relacionadas