【问题标题】:I Can't get an nsmanageobjectcontext我无法获得 nsmanageobjectcontext
【发布时间】:2013-11-12 20:36:07
【问题描述】:

我(有点)关注斯坦福 CS193P ios 课程,我试图获取文档上下文,而不必从控制器传递到控制器。 Haggerty 教授使用这种方法来获取他的上下文,但它对我不起作用。我拼写正确,当我通过它时我可以得到上下文,但当我以这种方式得到它时却不行。
我错过了什么吗?我只想获取我知道我创建的数据库的上下文,而无需传入。s

- (void)useDemoDocument
{
    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:@"Demo Document"];
    UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url];

    if (![[NSFileManager defaultManager] fileExistsAtPath:[url path]]) {
        [document saveToURL:url
           forSaveOperation:UIDocumentSaveForCreating
          completionHandler:^(BOOL success) {
              if (success) {
                  self.managedObjectContext = document.managedObjectContext;
                  [self refresh];
              }
          }];
    } else if (document.documentState == UIDocumentStateClosed) {
        [document openWithCompletionHandler:^(BOOL success) {
            if (success) {
                self.managedObjectContext = document.managedObjectContext;
            }
        }];
    } else {
        self.managedObjectContext = document.managedObjectContext;
    }
}

【问题讨论】:

  • 它“对我不起作用”究竟如何?
  • 上下文没有指向我指定的数据库文件

标签: ios core-data


【解决方案1】:

我认为您没有拼错任何内容,但您可能对该方法的作用有错误的期望。该方法不返回任何上下文。它将上下文设置为类属性(但仅在某些情况下!)。 所以调用这个方法后你应该可以访问 self.managedObjectContext 属性了。

但是.. 方法实现不是很干净,因此有点危险。它只会为成功的场景设置“managedObjectContext”属性。在其他情况下,该方法不会清除 self.managedObjectContext 属性,因此在这些情况下不清楚 self.managedObjectContext 指向什么。 由于该方法不提供任何成功状态,因此如果 managedObjectContext 设置正确,您永远无法相信。

【讨论】:

  • 好的,谢谢。你能指出我正确的方向吗?我需要返回指向 URL 中指定的数据库的上下文,这样我就可以在其他 VC 中使用,而无需将其从 VC 传递到 VC。谢谢
  • 您是否尝试使用调试器查看实际执行了哪些代码?
  • 是的,代码已执行,只是不会将上下文返回到该位置的数据库。令人沮丧。
  • 您说“仅在某些情况下”是什么意思。感谢您的帮助。
  • 如果您查看完成处理程序,当成功 == NO 时,managedObjectContext 不会(重新)设置,因此 managedObjectContext 属性将保留它的旧值(无论它是什么)。您可以通过设置 self.managedObjectContext = nil; 来启动该方法,从而轻松解决此问题
【解决方案2】:

我也遇到了同样的问题(也在上斯坦福课)。我已经找到了解决方案,你可以在这里找到它iOS 7 Completion handler never gets called

OpenWithCompletionHandler 是异步的,因此应用程序可能会在完成处理程序块完成执行之前尝试使用上下文。因此,该方法似乎不起作用。使用运行循环将解决您的问题。

【讨论】:

  • 还是没有运气。请注意,我正在等待完成处理程序完成。在我想我是;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多