5

Quiero persistir un bloque dentro de los datos centrales NSManagedObject si es posible. Tengo una clase heredada de NSManagedObject. Esta clase tiene un bloque para satisfacer algunas llamadas asincrónicas. Traté de almacenar el bloque como un atributo Transformable y Transitorio. cuando intento invocar el bloque antes de cargar mi NSManagedObject, tengo un acceso de memoria incorrecto al "EXC_BAD_ACCESS".¿Es posible almacenar un bloque dentro de un NSManagedObject?

Si no activa la bandera transformable tengo una excepción similar a esto:

-[__NSStackBlock__ encodeWithCoder:]: unrecognized selector sent to instance 0xbfffd930 

Soy nuevo en IOS. Estoy trabajando con iOS 5 SDK con ARC habilitado. Este es un extracto de mi código:

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@class ModbusRegister, Board; 
typedef void (^DataBlockType)(NSArray *listRegister); 

@interface EnergyEntry : NSManagedObject 
- (void)invokeWithData: (NSArray *)listRegister; 

@property (nonatomic, copy) DataBlockType datablock; 

@end 

#import "EnergyEntry.h" 

@implementation EnergyEntry 

@dynamic datablock; 

- (void)invokeWithData: (NSArray *)listRegister{ 

    self.datablock(listRegister); 
} 

@end 

Cuando traté de guardar el bloque:

[energyEntry setValue:@"Energía activa" forKey:@"name"]; 
[energyEntry setValue:[NSNumber numberWithDouble:0] forKey:@"value"]; 
[energyEntry setValue:currentBoard forKey:@"board"]; 

[energyEntry setValue:^(NSArray *listRegister){ 
    //...my block operations to store 
} forKey:@"datablock"]; 

Finalmente cuando invoco el bloque y el error se dispara:

NSArray *listRegister=... //my ready array 
[energyEntry invokeWithData:listRegister]; 

Respuesta

3

Usted no se puede almacenar un bloque como un tipo transformable. De acuerdo con Apple documentation el objeto transformable tiene que ser convertible a NSData. El bloque no se puede convertir a NSData porque es una referencia del compilador al código compilado, no a algunos datos que se pueden mover.

Solo una nota, que el bloque es como un método anónimo. Puede llamarlo muchas veces, cada vez con un parámetro diferente. Así que nada le impide almacenar el bloque una sola vez y llamarlo varias veces en cada llamada asincrónica por separado. Si crees que necesitas muchos bloques, lo más probable es que necesites almacenar los datos que se deben pasar a cada invocación de bloque.

Cuestiones relacionadas