2

我对核心数据的真正运作方式没有清晰的了解。可能这就是我面临的结果。我有一个应用程序,在其中我通过应用程序使用单个managedObjectContext。我知道 managedObjectContext 拥有其中的所有 managedObjects ,并且在我重置上下文之前,该对象始终由上下文本身保留。所以,我要做的是获取一些主要对象,例如用户数据,然后继续在整个视图控制器中传递相同的对象。如果发生某些更改,则该对象将由其他一些代码刷新。这在几乎所有情况下都非常有效。

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

我的代码看起来像这样,

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

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

第一视图控制器:

@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"];
}

第二视图控制器

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

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

大多数时候它都很好。但是,在我当前的视图控制器中很多时候,即使对象已同步到网络,它也似乎为空,我的意思是该对象仍然存在所有属性描述,但其中没有值。但是,过了一段时间又突然出现。

可能发生了什么。如何保持对象同步到根上下文并在发生任何更改时刷新?保持一个强有力的指针,这是否能够解决我所有的问题。我想这可能是因为对象没有出错。我如何才能在其中一个对象中专门排除一个对象,以便它对所有其他对象可见。

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

4

1 回答 1

1

如果您需要对象在刷新后仍然存在,请不要软弱地握住它,而是用力握住它。然后你可以refreshObject:在上下文刷新后调用它。或者,在您的访问器中使用延迟获取,以便当您访问您的对象并且它为 nil 时,我们会再次执行获取。

也可以看看:

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

于 2013-02-15T19:02:27.323 回答