gpt4 book ai didi

ios - 核心数据 : setPrimitiveValue:forKey: behaves really weirdly

转载 作者:可可西里 更新时间:2023-11-01 03:34:29 26 4
gpt4 key购买 nike

这是一个谜:

我在 NSManagedObject 上调用 setPrimitiveValue:forKey:。键是对象的一个​​合法的、持久的、模型化的属性。但是,setPrimitiveValue:forKey: 会失败,通常会为不同 的任意属性设置值。文档说,当为未建模的键调用 setPrimitiveValue:forKey: 时,这种行为是预期的。所以看起来 Core Data 认为 key 是未建模的。

奇怪的部分:

当键被硬编码为字符串文字时,原始值确实设置成功。只有当键是一个变量时它才会失败。我使用的变量恰好是从 observeValueForKeyPath:ofObject:change:context:

keyPath 参数传递过来的

keyPath 变量与字符串文字相同。 isEqual: 返回 true 且哈希值相等。 keyPath 变量的类型为 __NSCFString。有谁知道为什么 setPrimitiveValue:forKey: 会有不同的行为? (此行为在 OS X 10.9.1 上)


包含更好信息的更新:

行为不当的 key 追溯到从磁盘文件加载的字符串。下面的例子是一个孤立的案例。如果将属性字符串“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;
}

最佳答案

您需要以下 3 个语句来设置值。试试吧。

[self willChangeValueForKey:key];
[boo setPrimitiveValue:@(5) forKey:key];
[self didChangeValueForKey:key];

关于ios - 核心数据 : setPrimitiveValue:forKey: behaves really weirdly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20668250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com