5

Desidero mantenere un blocco all'interno dei dati principali NSManagedObject se è possibile. Ho una classe ereditata da NSManagedObject. Questa classe ha un blocco per soddisfare alcune chiamate asincrone. Ho provato a memorizzare il blocco come attributo trasformabile e transitorio. quando provo a richiamare il blocco prima di caricare il mio NSManagedObject, ho un accesso errato alla memoria "EXC_BAD_ACCESS".È possibile memorizzare un blocco all'interno di NSManagedObject?

Se non controllare il flag trasformabile ho un'eccezione simile a questo:

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

Sono nuovo in iOS. Sto lavorando con iOS 5 SDK con ARC abilitato. Questo è un estratto dal mio codice:

#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 

Quando ho cercato di conservare il blocco:

[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"]; 

Infine quando invoco il blocco e l'errore viene generato:

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

risposta

3

È non è possibile memorizzare un blocco come tipo trasformabile. Secondo l'articolo Apple documentation, l'oggetto trasformabile deve essere convertibile in NSData. Il blocco non può essere convertito in NSData perché è il riferimento di un compilatore al codice compilato, non alcuni dati che possono essere spostati.

Solo una nota, che il blocco è come un metodo anonimo. Puoi chiamarlo più volte, ogni volta con un parametro diverso. Quindi niente ti impedisce di archiviare il blocco una sola volta e di chiamarlo più volte in ogni chiamata asincrona separatamente. Se pensate di aver bisogno di molti blocchi, molto probabilmente avete solo bisogno di memorizzare i dati che dovrebbero essere passati a ogni invocazione di blocco.

Problemi correlati