5

Chcę utrzymywać blok wewnątrz danych podstawowych NSManagedObject, jeśli jest to możliwe. Posiadam dziedziczoną klasę z NSManagedObject. Ta klasa ma blok do zaspokojenia niektórych połączeń asynchronicznych. Próbowałem przechowywać blok jako atrybut przejściowy i przejściowy. kiedy próbuję wywołać blok przed ładowaniem mój NSManagedObject Mam zły dostęp do pamięci "EXC_BAD_ACCESS".Czy jest możliwe przechowywanie bloku wewnątrz obiektu NSManagedObject?

Jeśli nie sprawdzić Transformable flagę Mam wyjątek podobny do tego:

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

Jestem nowy w iOS. Pracuję w systemie iOS 5 SDK z włączonym ARC. Jest to wyciąg z mojego kodu:

#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 

Kiedy próbowałem zapisać blok:

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

Wreszcie kiedy wywołać blok i błąd został zwolniony:

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

Odpowiedz

3

You nie może przechowywać bloku jako typu przekształcalnego. Zgodnie z Apple documentation obiekt podlegający transformacji musi być wymienny na NSData. Bloku nie można przekonwertować na NSData, ponieważ jest to odnośnik kompilatora do skompilowanego kodu, a nie niektóre dane, które można przenosić.

Tylko uwaga, że ​​blok jest jak metoda anonimowa. Możesz go wywołać wiele razy, za każdym razem za pomocą innego parametru. Nic nie powstrzymuje cię od przechowywania bloku jeden raz i wywoływania go wiele razy w każdym asynchronicznym wywołaniu osobno. Jeśli uważasz, że potrzebujesz wielu bloków, najprawdopodobniej po prostu musisz przechowywać dane, które powinny zostać przekazane do każdego wywołania bloku.

Powiązane problemy