2013-12-18 3 views
7

Это тайна:Основные данные: setPrimitiveValue: forKey: ведет себя очень странно

Я вызов setPrimitiveValue:forKey: на NSManagedObject. Ключ является законным, постоянным, смоделированным атрибутом объекта. Однако setPrimitiveValue: forKey: fail, часто устанавливая значение для разных, произвольный атрибут. Документы говорят, что такое поведение ожидается при вызове setPrimitiveValue:forKey: для немоделированного ключа. Таким образом, кажется, что Core Data считает, что ключ не изменен.

Странная часть:

Когда ключ зашит в виде строкового литерала, то примитивное значение действительно установлены успешно. Он только терпит неудачу, когда ключ является переменной. Переменная, которую я использую, передается из аргумента keyPathobserveValueForKeyPath: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; 
} 
+0

Мы также видели аналогичное поведение в iOS, не выполнив «общую» ошибку проверки при сохранении. Ваш вопрос дает интересное представление о том, почему это происходит. –

+2

Я не знаю, но мне было бы интересно увидеть код из 'observValueForKeyPath: ofObject: change: context:' где возникает проблема. –

+0

Можете ли вы поместить это в тестовый проект? –

ответ

1

Вам нужно ниже 3 заявления, чтобы установить значение. Попробуй.

[self willChangeValueForKey:key]; 
[boo setPrimitiveValue:@(5) forKey:key]; 
[self didChangeValueForKey:key]; 
Смежные вопросы