0

我(有点)关注斯坦福 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;
    }
}
4

2 回答 2

0

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

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

于 2013-11-13T09:48:43.783 回答
0

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

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

于 2013-11-24T11:40:25.407 回答