Это тайна:Основные данные: setPrimitiveValue: forKey: ведет себя очень странно
Я вызов setPrimitiveValue:forKey:
на NSManagedObject
. Ключ является законным, постоянным, смоделированным атрибутом объекта. Однако setPrimitiveValue: forKey: fail, часто устанавливая значение для разных, произвольный атрибут. Документы говорят, что такое поведение ожидается при вызове setPrimitiveValue:forKey:
для немоделированного ключа. Таким образом, кажется, что Core Data считает, что ключ не изменен.
Странная часть:
Когда ключ зашит в виде строкового литерала, то примитивное значение действительно установлены успешно. Он только терпит неудачу, когда ключ является переменной. Переменная, которую я использую, передается из аргумента keyPath
observeValueForKeyPath:ofObject:change:context:
Переменная keyPath
такая же, как строковый литерал. isEqual:
возвращает true, а значения хэша равны. Переменная keyPath
имеет тип __NSCFString
. Кто-нибудь знает, почему setPrimitiveValue:forKey:
будет вести себя по-другому? (Это поведение на OS X 10.9.1)
Обновление с более полной информации:
ключ Сбой в прослежены в строку, загруженной из файла на диске. Пример ниже - изолированный случай. Если строка атрибута «mainAttr» записывается на диск и считывается обратно, то setPrimitiveValue:forKey:
устанавливает значение для неправильного атрибута, а не «mainAttr».
Основной объект данных:
@interface Boo : NSManagedObject
@property (nonatomic, retain) NSNumber * mainAttr;
@property (nonatomic, retain) NSNumber * attr1;
@property (nonatomic, retain) NSNumber * attr2;
@property (nonatomic, retain) NSNumber * attr3;
@end
-
#import "Boo.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSManagedObjectContext *context = managedObjectContext();
NSString *key = @"mainAttr";
// write to disk, read back in
NSString *path = [@"~/Desktop/test.txt" stringByExpandingTildeInPath];
[key writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:NULL];
key = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
Boo *boo = [NSEntityDescription insertNewObjectForEntityForName:@"Boo" inManagedObjectContext:context];
[boo setPrimitiveValue:@(5) forKey:key];
NSLog(@"Boo: %@", boo);
}
return 0;
}
Мы также видели аналогичное поведение в iOS, не выполнив «общую» ошибку проверки при сохранении. Ваш вопрос дает интересное представление о том, почему это происходит. –
Я не знаю, но мне было бы интересно увидеть код из 'observValueForKeyPath: ofObject: change: context:' где возникает проблема. –
Можете ли вы поместить это в тестовый проект? –