访问托管对象的 NSString 属性
Posted
技术标签:
【中文标题】访问托管对象的 NSString 属性【英文标题】:Accessing NSString property of a Managed object 【发布时间】:2014-04-04 19:21:27 【问题描述】:我正在开发一个带有核心数据、Restkit 的应用程序,并且有一个简单的托管对象,如下所示 -
@interface MyManagedObject : NSManagedObject
@property (nonatomic, strong) NSString *timeZone;
@end
我的问题是,当我尝试访问 myManagedObj.timeZone 时,我得到的值是 -
US/Pacific (
HTTP =
request =
URL = "https://myapp.com/getTimeZone";
headers =
Accept = "application/json";
"Accept-Language" = "en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5";
"Content-Type" = "application/json; charset=utf-8";
"User-Agent" = "MyApp/204 (iPhone Simulator; ios 7.0.3; Scale/2.00)";
;
method = POST;
;
response =
URL = "https://myapp.com/getTimeZone";
headers =
"Access-Control-Allow-Origin" = "*";
"Alternate-Protocol" = "443:quic";
"Cache-Control" = "no-cache";
"Content-Type" = "application/json";
Date = "Fri, 04 Apr 2014 19:11:09 GMT";
Expires = "Fri, 04 Apr 2014 19:11:09 GMT";
Vary = "Accept-Encoding";
;
;
;
mapping =
collectionIndex = 2955515963;
rootKeyPath = "data.user_profile";
;
)
我期望的值只是“美国/太平洋”,不知道为什么附加了 HTTP 请求/响应。如果我终止应用程序并重新启动它,我只会得到“美国/太平洋”。不知道为什么?
感谢您的帮助。
设置时区的代码是-
NSURLRequest *request = [[RKObjectManager sharedManager] requestWithObject:self method:RKRequestMethodPOST path:[NSString stringWithFormat:@"/getTimeZone/%@", loginTypeString] parameters:params];
[self prioritizedRequestOperationWithRequest:request
queuePriority:NSOperationQueuePriorityVeryHigh
threadPriority:1
targetObject:self
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
myManagedObject = (MyManagedObject *)[mappingResult firstObject];
failure:^(RKObjectRequestOperation *operation, NSError *error, UCNetworkRequestError *ucError)
useManagedRequest:YES];
下面是 MyManagedObject 的响应映射 -
+ (RKObjectMapping *)responseMapping
RKEntityMapping *entityMapping = [RKEntityMapping mappingForEntityForName:@"MyManagedObject" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore];
[entityMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"timeZone"]]; // array of strings
return entityMapping;
【问题讨论】:
可以分享设置youObject.timeZone时的代码吗? 更新了问题以共享有关如何设置数据的代码。 【参考方案1】:您看到的日志来自 RestKit 在映射期间使用的代理对象。它实际上并没有保存到商店中,它只是在映射期间使用。您无需担心,因为您发送到代理的任何消息都将被转发到真正的底层项目(在本例中为纯字符串) - 除了描述,因此您会看到详细的输出。
当您终止应用程序时,您将从数据存储中重新获取项目,以便您获得真正的底层数据,减去代理。
【讨论】:
谢谢。这是有道理的。 但是,我无法理解这一点:MyManagedObject 实例存储在 NSSet 中。所以当我尝试使用[NSPredicate predicateWithFormat:@"timeZone == %@", @"US/Pacific"]
归档集合时,结果集合是空的!所以我必须实现的解决方法是使用 forloop 迭代 NSSet 并与循环中的每个 set 对象进行 isEqualToString 比较。
使用mappingResult
中返回的托管对象?改为在数据存储上的 fetch 请求中运行您的谓词。以上是关于访问托管对象的 NSString 属性的主要内容,如果未能解决你的问题,请参考以下文章
不可变字符串 NSString与可变字符串 NSMutableString