Core data RESTKit:故障未触发
我无法在核心数据中触发故障 m 我在本地获取Core data RESTKit:故障未触发,core-data,restkit,restkit-0.20,fault,Core Data,Restkit,Restkit 0.20,Fault,我无法在核心数据中触发故障 m 我在本地获取用户,如果找不到,则获取服务器 一旦找到用户,我就在主队列上设置标签属性,这就是应用程序崩溃的地方,因为故障从未触发,所有内容都是nil - (void)didFinishFindingUser:(NSString*)user withResults:(NSArray*)results { dispatch_async(dispatch_get_main_queue(), ^{ if (results.count > 0)
用户
,如果找不到,则获取服务器
一旦找到用户
,我就在主队列上设置标签属性,这就是应用程序崩溃的地方,因为故障从未触发,所有内容都是nil
- (void)didFinishFindingUser:(NSString*)user withResults:(NSArray*)results
{
dispatch_async(dispatch_get_main_queue(), ^{
if (results.count > 0)
{
self.inviteUser = (User*)[results firstObject];
[self setNameForUser:self.inviteUser];
}
});
}
- (void)setNameForUser:(User*)user
{
[self.activityIndicator stopAnimating];
NSLog(@"User.firstName %@", user.firstName);
//Code here to configure the labels
//This is where the App crashes as the values are coming as nil
}
日志:
我可以做些什么来触发故障并访问属性
**更新**
我已经将问题缩小到调用主队列时,对象在没有上下文的情况下转入错误
代码
- (void)didFinishFindingUser:(NSString*)user withResults:(NSArray*)results
{
if (results.count > 0)
{
self.inviteUser = (User*)[results firstObject];
NSLog(@"***** Thread BEFORE main_queue: %@", [NSThread currentThread]);
NSLog(@"NewUser %@", self.inviteUser);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"***** Thread AFTER main_queue: %@", [NSThread currentThread]);
NSLog(@"NewUser %@", self.inviteUser);
[self setNameForUser:self.inviteUser];
});
}
}
- (void)setNameForUser:(User*)user
{
NSString *firstInitial = user.firstName.length > 0 ? [user.firstName substringToIndex:kInitialIndex] : [kFirstNamePlaceholder substringToIndex:kInitialIndex];
NSString *lastInitial = user.lastName.length > 0 ? [user.lastName substringToIndex:kInitialIndex] : [kLastNmaePlaceholder substringToIndex:kInitialIndex];
self.labelInitials.text = [firstInitial stringByAppendingString:lastInitial];
self.labelName.text = [NSString stringWithFormat:@"%@ %@", user.firstName.length > 0 ? user.firstName : kFirstNamePlaceholder, user.lastName.length > 0 ? user.lastName : kLastNmaePlaceholder];
self.labelUserID.text = [@"@" stringByAppendingString:user.userid];
}
日志:
2014-07-27 06:01:03.197 App[24030:3d07] ***** Thread BEFORE main_queue: <NSThread: 0xd6b2750>{name = (null), num = 4}
2014-07-27 06:01:03.198 App[24030:3d07] User Context <NSManagedObjectContext: 0xdb9a380>
2014-07-27 06:01:03.198 App[24030:3d07] NewUser <User: 0xda83280> (entity: User; id: 0xda7c4f0 <x-coredata://5251395C-DDDC-424C-9372-EA8D883E0AE6/User/p1> ; data: {
firstName = Lois;
lastName = Lane;
userid = "lois.lane";
})
2014-07-27 06:01:03.199 App[24030:3d07] ***** Thread BEFORE main_queue: <NSThread: 0xd6b2750>{name = (null), num = 4}
2014-07-27 06:01:03.199 App[24030:3d07] User Context <NSManagedObjectContext: 0xdb9a380>
2014-07-27 06:01:03.200 App[24030:3d07] NewUser <User: 0xda83280> (entity: User; id: 0xda7c4f0 <x-coredata://5251395C-DDDC-424C-9372-EA8D883E0AE6/User/p1> ; data: {
firstName = Lois;
lastName = Lane;
userid = "lois.lane";
})
2014-07-27 06:01:03.201 App[24030:3d07] ***** Thread BEFORE main_queue: <NSThread: 0xd6b2750>{name = (null), num = 4}
2014-07-27 06:01:03.201 App[24030:3d07] User Context <NSManagedObjectContext: 0xdb9a380>
2014-07-27 06:01:03.201 App[24030:3d07] NewUser <User: 0xda83280> (entity: User; id: 0xda7c4f0 <x-coredata://5251395C-DDDC-424C-9372-EA8D883E0AE6/User/p1> ; data: {
firstName = Lois;
lastName = Lane;
userid = "lois.lane";
})
2014-07-27 06:01:03.203 App[24030:3d07] ***** Thread BEFORE main_queue: <NSThread: 0xd6b2750>{name = (null), num = 4}
2014-07-27 06:01:03.203 App[24030:3d07] User Context <NSManagedObjectContext: 0xdb9a380>
2014-07-27 06:01:03.203 App[24030:3d07] NewUser <User: 0xda83280> (entity: User; id: 0xda7c4f0 <x-coredata://5251395C-DDDC-424C-9372-EA8D883E0AE6/User/p1> ; data: {
firstName = Lois;
lastName = Lane;
userid = "lois.lane";
})
2014-07-27 06:01:03.205 App[24030:3d07] ***** Thread BEFORE main_queue: <NSThread: 0xd6b2750>{name = (null), num = 4}
2014-07-27 06:01:03.205 App[24030:3d07] User Context <NSManagedObjectContext: 0xdb9a380>
2014-07-27 06:01:03.206 App[24030:3d07] NewUser <User: 0xd97fc00> (entity: User; id: 0xd97a510 <x-coredata://5251395C-DDDC-424C-9372-EA8D883E0AE6/User/p2> ; data: {
firstName = Lois;
lastName = Lane;
userid = "lois.lane";
})
2014-07-27 06:01:03.207 App[24030:60b] ***** Thread AFTER main_queue: <NSThread: 0xdf80f80>{name = (null), num = 1}
2014-07-27 06:01:03.207 App[24030:60b] User Context (null)
2014-07-27 06:01:03.207 App[24030:3d07] ***** Thread BEFORE main_queue: <NSThread: 0xd6b2750>{name = (null), num = 4}
2014-07-27 06:01:03.208 App[24030:60b] NewUser <User: 0xda83280> (entity: User; id: 0xda7c4f0 <x-coredata://5251395C-DDDC-424C-9372-EA8D883E0AE6/User/p1> ; data: <fault>)
2014-07-27 06:01:03.208 App[24030:3d07] User Context <NSManagedObjectContext: 0xdb9a380>
(lldb)
2014-07-27 06:53:28.390 App[27898:60b] inviteUser Context (null)
2014-07-27 06:53:28.390 App[27898:60b] inviteUser (null)
日志:
2014-07-27 06:01:03.197 App[24030:3d07] ***** Thread BEFORE main_queue: <NSThread: 0xd6b2750>{name = (null), num = 4}
2014-07-27 06:01:03.198 App[24030:3d07] User Context <NSManagedObjectContext: 0xdb9a380>
2014-07-27 06:01:03.198 App[24030:3d07] NewUser <User: 0xda83280> (entity: User; id: 0xda7c4f0 <x-coredata://5251395C-DDDC-424C-9372-EA8D883E0AE6/User/p1> ; data: {
firstName = Lois;
lastName = Lane;
userid = "lois.lane";
})
2014-07-27 06:01:03.199 App[24030:3d07] ***** Thread BEFORE main_queue: <NSThread: 0xd6b2750>{name = (null), num = 4}
2014-07-27 06:01:03.199 App[24030:3d07] User Context <NSManagedObjectContext: 0xdb9a380>
2014-07-27 06:01:03.200 App[24030:3d07] NewUser <User: 0xda83280> (entity: User; id: 0xda7c4f0 <x-coredata://5251395C-DDDC-424C-9372-EA8D883E0AE6/User/p1> ; data: {
firstName = Lois;
lastName = Lane;
userid = "lois.lane";
})
2014-07-27 06:01:03.201 App[24030:3d07] ***** Thread BEFORE main_queue: <NSThread: 0xd6b2750>{name = (null), num = 4}
2014-07-27 06:01:03.201 App[24030:3d07] User Context <NSManagedObjectContext: 0xdb9a380>
2014-07-27 06:01:03.201 App[24030:3d07] NewUser <User: 0xda83280> (entity: User; id: 0xda7c4f0 <x-coredata://5251395C-DDDC-424C-9372-EA8D883E0AE6/User/p1> ; data: {
firstName = Lois;
lastName = Lane;
userid = "lois.lane";
})
2014-07-27 06:01:03.203 App[24030:3d07] ***** Thread BEFORE main_queue: <NSThread: 0xd6b2750>{name = (null), num = 4}
2014-07-27 06:01:03.203 App[24030:3d07] User Context <NSManagedObjectContext: 0xdb9a380>
2014-07-27 06:01:03.203 App[24030:3d07] NewUser <User: 0xda83280> (entity: User; id: 0xda7c4f0 <x-coredata://5251395C-DDDC-424C-9372-EA8D883E0AE6/User/p1> ; data: {
firstName = Lois;
lastName = Lane;
userid = "lois.lane";
})
2014-07-27 06:01:03.205 App[24030:3d07] ***** Thread BEFORE main_queue: <NSThread: 0xd6b2750>{name = (null), num = 4}
2014-07-27 06:01:03.205 App[24030:3d07] User Context <NSManagedObjectContext: 0xdb9a380>
2014-07-27 06:01:03.206 App[24030:3d07] NewUser <User: 0xd97fc00> (entity: User; id: 0xd97a510 <x-coredata://5251395C-DDDC-424C-9372-EA8D883E0AE6/User/p2> ; data: {
firstName = Lois;
lastName = Lane;
userid = "lois.lane";
})
2014-07-27 06:01:03.207 App[24030:60b] ***** Thread AFTER main_queue: <NSThread: 0xdf80f80>{name = (null), num = 1}
2014-07-27 06:01:03.207 App[24030:60b] User Context (null)
2014-07-27 06:01:03.207 App[24030:3d07] ***** Thread BEFORE main_queue: <NSThread: 0xd6b2750>{name = (null), num = 4}
2014-07-27 06:01:03.208 App[24030:60b] NewUser <User: 0xda83280> (entity: User; id: 0xda7c4f0 <x-coredata://5251395C-DDDC-424C-9372-EA8D883E0AE6/User/p1> ; data: <fault>)
2014-07-27 06:01:03.208 App[24030:3d07] User Context <NSManagedObjectContext: 0xdb9a380>
(lldb)
2014-07-27 06:53:28.390 App[27898:60b] inviteUser Context (null)
2014-07-27 06:53:28.390 App[27898:60b] inviteUser (null)
您的对象的托管对象上下文是nil
,这就是无法触发故障的原因。确保在获取用户对象时检查所有属性和上下文
当涉及到多线程时,RestKit有很多类似的问题。鉴于您的大量代码只是为了设置“对象管理器”,您是否考虑过使用纯核心数据和nsursession
?尝试以下方法以在主线程上下文中获取适当的对象:
recordObjectID = self.inviteUser.objectID;
dispatch_async(dispatch_get_main_queue(), ^{
NSManagedObjectContext *moc = self.objectManager.managedObjectStore.mainQueueManagedObjectContext;;
NSError * error = nil;
self.inviteUser = (User *) [moc existingObjectWithID:recordObjectID error:&error];
NSLog(@"***** Thread AFTER main_queue: %@", [NSThread currentThread]);
NSLog(@"inviteUser Context %@", [self.inviteUser managedObjectContext]);
NSLog(@"inviteUser %@", self.inviteUser);
[self setNameForUser:self.inviteUser];
});
但是请注意,在后台线程和后台管理的对象上设置self.inviteUser
都不是一个好主意。您应该只从后台线程返回托管对象ID
此外,如果您有一个对象管理器,那么您应该尝试使用一种在后台获取数据并为您切换到主线程的方法(即,如果您能够提供帮助,则不要直接使用操作)。由于您无法获取托管对象上下文,因此这不应该是一个错误问题。您应该直接记录用户对象和结果的内容。您是如何提出请求并调用did finish方法的?谢谢。我做了更新。如果您还想查看finish方法,请告诉我。是的。你为什么要自己换线程?您需要非常小心处理核心数据上下文和线程。不要在线程之间传递托管对象。在更新下,您可以看到代码。我正在获取主队列以更新UI。获取是在后台线程中完成的。当我尝试更改线程时,我还添加了更新2,但现在我得到了(null)。谢谢。这仍然显示为null。我想我要改变策略了。我选择此路径的原因是b/c我得到了Wrestkit.core_数据:RKManagedObjectMappingOperationDataSource.m:243使用零托管对象缓存执行托管对象映射:无法通过标识属性更新现有对象实例。可能会创建重复的对象。错误。
我将为此重新开一张罚单,并将此答案标记为正确。问题如下:
2014-07-27 06:53:28.390 App[27898:60b] inviteUser Context (null)
2014-07-27 06:53:28.390 App[27898:60b] inviteUser (null)
recordObjectID = self.inviteUser.objectID;
dispatch_async(dispatch_get_main_queue(), ^{
NSManagedObjectContext *moc = self.objectManager.managedObjectStore.mainQueueManagedObjectContext;;
NSError * error = nil;
self.inviteUser = (User *) [moc existingObjectWithID:recordObjectID error:&error];
NSLog(@"***** Thread AFTER main_queue: %@", [NSThread currentThread]);
NSLog(@"inviteUser Context %@", [self.inviteUser managedObjectContext]);
NSLog(@"inviteUser %@", self.inviteUser);
[self setNameForUser:self.inviteUser];
});