gpt4 book ai didi

ios - Core Data 未将 NSManagedObject 实例作为应用程序委托(delegate)的属性触发故障

转载 作者:可可西里 更新时间:2023-11-01 04:26:16 25 4
gpt4 key购买 nike

我将登录用户的数据从服务器导入到一个名为“用户”的核心数据实体中。我还将此特定用户对象的引用保留在我的 AppDelegate 上(作为属性),以便我可以在我的应用程序的其他地方访问它。我面临的问题是,当我按下另一个 View Controller 并尝试访问 appdelegate.loggedInUser.id 时,我看到“id”为零。调试器为对象显示了这个:

$24 = 0x0b28ad30 <User: 0xb28ad30> (entity: User; id: 0xb261160 <x-coredata:///User/tC48E8991-B8A6-4E68-9112-93F9F21DB5382> ; data: <fault>)

我的理解是,当我尝试访问该对象的某个属性时,Core Data 框架会触发错误。我很困惑为什么在这种情况下我访问用户的“id”属性没有触发错误?

编辑:

这是创建和使用 loggedInUser 对象的方式:

//method to get bgContext 
+(NSManagedObjectContext *)getContextOnBgWithParentSetToMainMOC
{
NSManagedObjectContext *tmpContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[tmpContext setParentContext:[Utils getAppDelegate].managedObjectContext];
return tmpContext;
}

//in App Delegate
NSManagedObjectContext *bgContext = [NSManagedObjectContext getContextOnBgWithParentSetToMainMOC];
self.loggedInUser = [User importFromObject:loggedInUserData inContext:bgContext completionBlock:^(NSManagedObjectContext *theContext, NSManagedObject *theManagedObjectWithValuesImported) {}];

//In User.m file
+ (User *)importFromObject:(NSDictionary *)dictionary inContext:(NSManagedObjectContext *)context completionBlock:(TemporaryContextImportReturnBlock)block {

if ( !context ){
context = [NSManagedObjectContext getContextOnBgWithParentSetToMainMOC];
}

NSManagedObjectContext *localContext = context;
User *newUserEntity = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:localContext];
NSArray *emailsArray = [dictionary objectForKey:@"emails"];
NSString *emailsString = @"";
if ([emailsArray count] > 0){
emailsString = [emailsArray componentsJoinedByString:@","];
}
newUserEntity.emails = emailsString;
newUserEntity.id = [dictionary objectForKey:@"id"];
newUserEntity.n = [dictionary nonNullObjectForKey:@"n"];
return newUserEntity;
}

//Access in one of the view controllers
User *loggedInUser = [Utils getAppDelegate].loggedInUser;
// loggedInUser.id /*nil*/

最佳答案

我也遇到了同样的问题。事实证明,根据this answer ,它引用了 Apple docsNSManagedObject 确实如您所料那样持有对其 NSManagedObjectContext 的强引用。我怀疑如果您在对象未正确触发错误时检查对象,则 [myObject managedObjectContext] == nil

我不知道这里有哪些最佳实践。显而易见(但可能很困难)的解决方案是找出您的 MOC 被释放的原因。作为替代方案,虽然我不确定这样做是否安全,但您可以从每个 NSManagedObject 实例中保留 MOC。 (我对打开的 here 有疑问。)

关于ios - Core Data 未将 NSManagedObject 实例作为应用程序委托(delegate)的属性触发故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17867882/

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