返回对象不为空但为空
Posted
技术标签:
【中文标题】返回对象不为空但为空【英文标题】:Return object not null but empty 【发布时间】:2014-04-18 19:07:28 【问题描述】:我无法解决以下方法遇到的小问题:
+ (User *) createUserForLoginWithFacebookToken: (NSString *) facebookToken andExpirationToken: (NSDate *) expirationToken
//Init current user before having collected data from API after authentication
NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
managedObjectContext.parentContext = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"User" inManagedObjectContext:managedObjectContext.parentContext];
User * result = [[User alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:managedObjectContext];
result.email=@"defaultValue@test.com";
result.gender=[NSNumber numberWithInt:-1];
if (facebookToken != nil && expirationToken != nil && ![facebookToken isEqualToString:@""] && [expirationToken compare:[NSDate date]]==NSOrderedDescending)
result.facebookToken=facebookToken;
result.facebookExpiration=expirationToken;
return result;
在返回之前,会创建结果变量并设置一些属性。但是当我用这个方法获取这个返回的对象时:
currentUser=[User createUserForLoginWithFacebookToken:facebookToken andExpirationToken:facebookExpiration];
currentUser 变量存在,但所有属性均为零。
我是 Objective-c 的初学者,我很确定解决方案是显而易见的,但我现在无法修复它。
提前感谢您的帮助。
【问题讨论】:
调试器中的nil,还是NSLog输出中的nil? 它在调试器上(我的测试),所以我刚刚放了一个 NSLog,最后它们都为零。 【参考方案1】:哦,我明白了。您正在为此方法创建一个 MOC,并且永远不会将它与您在方法范围之外使用的上下文合并,因此您在插入后所做的更改不会保存。我敢打赌,很多人只是略读而过,因为整个 MOC 实体名称/插入垃圾总是如此冗长。
我自己的方法与您的createUserForLoginWithFacebookToken:
类似,我将我正在使用的MOC 作为NSManagedObjectContext*
类型的附加方法参数传入。我不会分配一个全新的 MOC,将一个对象插入其中,然后合并。一般来说,每个线程有一个 MOC。
【讨论】:
你完全正确!它完美地工作。谢谢 !为了获得我的 Moc,我使用了appDelegate.managedObjectStore.mainQueueManagedObjectContext
并将其作为我的方法 createUserForLoginWithFacebookToken
的新参数传递。问题解决了!
是的。并且您将它作为参数传递而不是在方法中引用 App Delegate 的指针的原因是,将来您可以转向使用后台线程 MOC以上是关于返回对象不为空但为空的主要内容,如果未能解决你的问题,请参考以下文章