我无法获得nsmanageobjectcontext

时间:2013-11-12 20:36:08

标签: ios core-data

我(有点)遵循斯坦福CS193P ios类,我正在尝试获取文档上下文,而不必从控制器传递到控制器。 Haggerty教授使用这种方法来获取他的背景,但它对我不起作用。我正在拼写所有内容,当我通过它时我可以得到上下文,但不是当我这样做时 我错过了什么?我只想获得我知道我创建的数据库的上下文,而不必传入。

- (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;
    }
}

2 个答案:

答案 0 :(得分:0)

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

然而..方法实现不是很干净,因此有点危险。它将仅为成功的方案设置'managedObjectContext'属性。在其他情况下,该方法不会清除self.managedObjectContext属性,因此在这些情况下,不清楚self.managedObjectContext指向的是什么。 由于该方法不提供任何成功状态,因此如果已正确设置managedObjectContext,则永远不会信任。

答案 1 :(得分:0)

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

找到它

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