CoreData: ошибка: не удалось вызвать назначенный инициализатор в классе NSManagedObject при использовании NSCoding

Я продолжаю получать эту ошибку при запуске моего приложения: «CoreData: ошибка: не удалось вызвать назначенный инициализатор в классе NSManagedObject «Скорая помощь»». Я уже видел эту проблему при переполнении стека, но не знаю, как реализовать решение в моем случае. Любые идеи?

Скорая помощь.ч

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


@interface Ambulance : NSManagedObject

@property (nonatomic, retain) NSString * ambulanceID;
@property (nonatomic, retain) NSNumber * distance;
@property (nonatomic, retain) NSNumber * etaDistance;
@property (nonatomic, retain) NSString * emsID;
@property (nonatomic, retain) NSString * lat;
@property (nonatomic, retain) NSString * lng;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * occupancy;
@property (nonatomic, retain) NSString * type;
@property (nonatomic, retain) NSString * websocketServer;
@property (nonatomic, retain) NSNumber * seconds;
@property (nonatomic, retain) id eta;

+(Ambulance *)nearestAmbulanceByType:(NSString *)type;


- (id)initWithCoder:(NSCoder *)decoder;
- (void)encodeWithCoder:(NSCoder *)encoder;


@end

Скорая помощь.м

#import "Ambulance.h"


@implementation Ambulance

@synthesize ambulanceID;
@synthesize distance;
@synthesize etaDistance;
@synthesize emsID;
@synthesize lat;
@synthesize lng;
@synthesize name;
@synthesize occupancy;
@synthesize type;
@synthesize websocketServer;
@synthesize seconds;
@synthesize eta;


+(Ambulance *)nearestAmbulanceByType:(NSString *)type {
NSArray *sortedArray = [Ambulance findByAttribute:@"type" withValue:type         andOrderBy:@"distance" ascending:YES];
return [sortedArray first];
 }


  - (void)encodeWithCoder:(NSCoder *)encoder {
//Encode properties, other class variables, etc
[encoder encodeObject:self.ambulanceID forKey:@"ambulanceID"];
[encoder encodeObject:self.distance forKey:@"distance"];
[encoder encodeObject:self.etaDistance forKey:@"etaDistance"];
[encoder encodeObject:self.emsID forKey:@"emsID"];
[encoder encodeObject:self.lat forKey:@"lat"];
[encoder encodeObject:self.lng forKey:@"lng"];
[encoder encodeObject:self.name forKey:@"name"];
[encoder encodeObject:self.occupancy forKey:@"occupancy"];
[encoder encodeObject:self.type forKey:@"type"];
[encoder encodeObject:self.websocketServer:@"websocketServer"];
[encoder encodeObject:self.seconds forKey:@"seconds"];
[encoder encodeObject:self.eta forKey:@"eta"];

}

- (id)initWithCoder:(NSCoder *)decoder {


if((self = [super init])) {
    //decode properties, other class vars


    self.ambulanceID = [decoder decodeObjectForKey:@"ambulanceID"];
    self.distance = [decoder decodeObjectForKey:@"distance"];
    self.etaDistance = [decoder decodeObjectForKey:@"etaDistance"];
    self.emsID = [decoder decodeObjectForKey:@"emsID"];
    self.lat = [decoder decodeObjectForKey:@"lat"];
    self.lng = [decoder decodeObjectForKey:@"lng"];
    self.name = [decoder decodeObjectForKey:@"name"];
    self.occupancy = [decoder decodeObjectForKey:@"occupancy"];
    self.type = [decoder decodeObjectForKey:@"type"];
    self.websocketServer = [decoder decodeObjectForKey:@"websocketServer"];
    self.seconds = [decoder decodeObjectForKey:@"seconds"];
    self.eta = [decoder decodeObjectForKey:@"eta"];

}
return self;
}

person owensco    schedule 27.06.2013    source источник


Ответы (2)


Вы должны использовать любой другой инициализатор, кроме initWithEntity:insertIntoManagedObjectContext: для вашего подкласса NSManagedObject.

Из документов:

Важно: этот метод является назначенным инициализатором для NSManagedObject. Вы не должны инициализировать управляемый объект, просто отправив его в init.

Вы уверены, что вам нужно использовать NSCoding с вашим подклассом? Вероятно, было бы достаточно сохранить objectID, поскольку ваш объект существует в NSManagedObjectContext и, вероятно, все равно сохраняется.

Если вы действительно полагаетесь на NSCoding, вы должны определить и передать правильный NSManagedObjectContext в initWithEntity:insertIntoManagedObjectContext: в initWithCoder:.

person Karl    schedule 27.06.2013

Не уверен, какое это имеет отношение к RestKit и почему вы считаете, что вам нужна поддержка кодирования.

Предполагая, что вы используете RestKit, вы сможете изменить его на:

- (id)initWithCoder:(NSCoder *)decoder {
    NSManagedObjectContext *moc = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Ambulance" inManagedObjectContext:moc];

    if((self = [super initWithEntity:entity insertIntoManagedObjectContext:moc])) {
    ...

Если вы не используете RestKit, вам понадобится другой способ получить MOC.

person Wain    schedule 27.06.2013