Реализация переходного свойства с базовыми данными - PullRequest
4 голосов
/ 25 августа 2011

Я не могу понять это.То, что я прочитал о переходных свойствах, говорит мне, что они могут быть идентифицированы в объектной модели с неопределенным типом.Но компилятор жалуется на это с ошибкой, что тип неизвестен.

Из Руководства по программированию Core Dat:

Если неподдерживаемый атрибут является объектом, то в модели управляемого объекта вы указываете его тип как неопределенный, и что он временный,При реализации пользовательского класса сущности нет необходимости добавлять переменную экземпляра для атрибута - вы можете использовать личное внутреннее хранилище управляемого объекта.Замечание о реализациях, описанных ниже, заключается в том, что они кэшируют переходное значение.Это делает доступ к значению более эффективным - это также необходимо для управления изменениями.Если вы определяете пользовательские переменные экземпляра, вы должны очистить эти переменные в didTurnIntoFault, а не dealloc или finalize.

Вот файл заголовка:

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

@class SearchTerms;

@interface SearchResult : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * lattitude;
@property (nonatomic, retain) NSString * details;
@property (nonatomic, retain) NSString * endTime;
@property (nonatomic, retain) NSString * longitude;
@property (nonatomic, retain) NSString * city;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSString * imageLink;
@property (nonatomic, retain) NSString * startTime;
@property (nonatomic, retain) UNKNOWN_TYPE coordinate;
@property (nonatomic, retain) UNKNOWN_TYPE subtitle;
@property (nonatomic, retain) SearchTerms * searchUsed;

@end

Я пытаюсь включитьсвойства для MKAnnotation с заголовком, подзаголовком и координатой.Здесь мне нужно извлечь субтитры из других полей и получить координаты по долготе и широте.

Я не уверен, как согласовать то, что говорится в Руководстве, и то, что выглядит явно неправильно, и компилятор говорит, что так.

Как только я получу правильный заголовок, я смогу получить правильную реализацию, и я буду использовать awakeFromFault для установки значений.Я не уверен, нужно ли мне выпустить субтитр, который будет строкой NSString, используя didTurnIntoFault, но, похоже, именно это и сказано в руководстве.

Я не видел действительно хорошего примера того, какреализовать простое переходное свойство.У меня возникает соблазн добавить свойства к объекту управляемого объекта и забыть упомянуть его в модели управляемого объекта.Но, похоже, я бы что-то упустил, если бы сделал это.

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

Вам необходимо изменить тип свойства на id или любой другой, наиболее подходящий:

@interface SearchResult : NSManagedObject
{}
@property (nonatomic, retain) id coordinate;
@end

Другой способ справиться с этим - через KVC и зависимые ключи:

@implementation SearchResult
+ (NSSet *) keyPathsForValuesAffectingCoordinate
{
  return [NSSet setWithObjects:@"latitude", @"longitude", nil];
}

- (id) coordinate
{
  // Derive the coordinate value
}
@end
1 голос
/ 26 августа 2011

Проблема здесь в том, что протокол MKAnnotation сохраняет свое значение coordinate в CLLocationCoordinate2D, которое является не объектом, а структурой, и оно не поддерживает кодирование значения ключа.Чтобы использовать его как переходное свойство, вам нужно будет обернуть его в объект.

Руководство по программированию базовых данных: ограничения скалярных значений

Если вы хотите использовать скалярный тип или структуру, которые не поддерживаются непосредственно CoreДанные, а не одна из структур, поддерживаемых кодированием значения ключа, необходимо хранить в управляемом объекте как объект - обычно это экземпляр NSValue, хотя вы также можете определить свой собственный класс.Затем вы будете обрабатывать его как значение объекта, как описано далее в этой статье.Пользователи объекта могут извлечь требуемую структуру из объекта NSValue (или пользовательского) при получении значения и преобразовать структуру в объект NSValue (или пользовательский) при установке значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...