核心数据并保留NSManagedObject

时间:2013-02-15 18:55:10

标签: ios objective-c core-data

我对核心数据的真正运作方式并不清楚。可能这是我面临的结果。我有一个应用程序,我通过应用程序使用单个 managedObjectContext 。我知道managedObjectContext保存在其中的所有托管对象中,直到我重置上下文,对象始终由上下文本身保留。所以,我所做的是获取一些主要对象,如用户数据,然后继续在整个视图控制器中传递相同的对象。如果发生某些更改,则该对象将由其他一些代码刷新。几乎在所有情况下都能很好地工作。

但是,我没有在任何 viewcontrollers 中保留指向该对象的强指针。我只是对它保留一个弱引用,因为该对象本身由managedObjectContext池保留。但是,当通过同步到远程来刷新对象时,我有时会遇到此策略的问题。我的弱指针变得无用。它没有数据。所有属性都变为空。虽然它在我记录时显示了所有属性名称,但值只是零。如何确保我的对象始终刷新并与主上下文同步?这种方法是保持对managedObject的弱指针是一个坏主意。我会说我不会在任何viewcontroller中保留它。所有视图控制器只使用弱指针。

我的代码看起来像这样,

在根视图控制器中,我获取数据

-(void)tableView:(UITableView*)tv didSelectRowAtIndexPath:(NSIndexPath*)indexPath{
  User *user = [self.fetchedResultsController objectAtIndexPath:indexPath];
  FirstViewController *firstViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"firstViewController"];
  firstViewController.user = user;
}

FirstViewController:

@interface FirstViewController:UIViewController
  @property(nonatomic, weak) User *user
@end

我在这里用对象做很多事情,同时我可以从rootViewController更新对象。但是,由于它是同一个对象,因此它似乎在大多数时间都会更新。

然后再次在第一个视图控制器中;

-(void)tableView:(UITableView*)tv didSelectRowAtIndexPath:(NSIndexPath*)indexPath{
  User *user = [self.fetchedResultsController objectAtIndexPath:indexPath];
  SecondViewController *secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"secondViewController"];
}

SecondViewController

@interface SecondViewController:UIViewController
  @property(nonatomic, weak) User *user
@end

这里再次弱化引用该对象。我用对象做了很多事情,或者其他一些视图控制器可以从远程同步,但它会不断更新。此对象被传递到深层次结构,直到最后一个视图控制器,并且所有这些视图控制器都保持弱指针。

大部分时间都很好。但是,在我当前的视图控制器中很多次,即使对象同步到网络,它似乎是null,我的意思是该对象仍然存在所有属性描述但没有值。但是,一段时间后突然出现。

可能发生了什么。如何保持对象同步到根上下文并在发生任何更改时刷新?保持强大的指针,这将能够解决我的所有问题。我想这可能是因为对象没有出现故障。如何对一个对象中的对象进行排他性故障,以使其对所有其他对象可见。

非常感谢您的帮助和考虑。我可能有一个糟糕的英语,但如果有人理解我的问题,并能以更好的方式表达,我也会为此感到高兴。 :)

1 个答案:

答案 0 :(得分:1)

如果您需要让对象在刷新后继续存在,请不要将其保持在弱位置,强烈握住它。然后,您可以在刷新上下文后调用refreshObject:。或者,在访问器中使用延迟提取,这样当您访问对象并且它为零时,我们再次进行提取。

另见:

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreData/Articles/cdTroubleshooting.html