Можно ли сохранить блок внутри NSManagedObject? - PullRequest
5 голосов
/ 22 марта 2012

Я хочу сохранить блок внутри основных данных NSManagedObject, если это возможно. У меня есть унаследованный класс от NSManagedObject. Этот класс имеет блок для удовлетворения некоторых асинхронных вызовов. Я пытался сохранить блок как атрибут Transformable и Transient. при попытке вызвать блок перед загрузкой NSManagedObject у меня плохой доступ к памяти "EXC_BAD_ACCESS".

Если я не проверяю трансформируемый флаг, у меня есть исключение, подобное этому:

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

Я новичок в iOS. Я работаю под iOS 5 SDK с включенной ARC. Это выдержка из моего кода:

#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

Когда я пытался сохранить блок:

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

Наконец, когда я вызываю блок и выдается ошибка:

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

1 Ответ

3 голосов
/ 22 марта 2012

Вы не можете сохранить блок как преобразуемый тип. Согласно документации Apple трансформируемый объект должен быть преобразован в NSData. Блок не может быть преобразован в NSData, потому что это ссылка компилятора на скомпилированный код, а не некоторые данные, которые можно перемещать.

Просто обратите внимание, что блок похож на анонимный метод. Вы можете вызывать его много раз, каждый раз с другим параметром. Так что ничто не мешает вам сохранить блок один раз и вызывать его много раз в каждом асинхронном вызове отдельно. Если вы считаете, что вам нужно много блоков, то, скорее всего, вам просто нужно хранить данные, которые должны быть переданы при каждом вызове блока.

...