Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UIManagedDocuments何时关闭?_Iphone_Ios_Objective C_Core Data_Uimanageddocument - Fatal编程技术网

Iphone UIManagedDocuments何时关闭?

Iphone UIManagedDocuments何时关闭?,iphone,ios,objective-c,core-data,uimanageddocument,Iphone,Ios,Objective C,Core Data,Uimanageddocument,我正在使用这个博客:为UIManagedDocumentsingleton创建一个singleton。以下是BetterDatabase //In BetterDatabase typedef void (^OnDocumentReady) (UIManagedDocument *document); - (void)performWithDocument:(OnDocumentReady)onDocumentReady { void (^OnDocumentDidLoad)(BOO

我正在使用这个博客:为
UIManagedDocument
singleton创建一个singleton。以下是
BetterDatabase

//In BetterDatabase

typedef void (^OnDocumentReady) (UIManagedDocument *document);

- (void)performWithDocument:(OnDocumentReady)onDocumentReady
{
    void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success) {
        onDocumentReady(self.document);
    };

    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]]) {
        [self.document saveToURL:self.document.fileURL
                forSaveOperation:UIDocumentSaveForCreating
               completionHandler:OnDocumentDidLoad];
    } else if (self.document.documentState == UIDocumentStateClosed) {
        [self.document openWithCompletionHandler:OnDocumentDidLoad];
    } else if (self.document.documentState == UIDocumentStateNormal) {
        OnDocumentDidLoad(YES);
    }
}

//In other class
[[BetterDatabase sharedDocumentHandler] performWithDocument:^(UIManagedDocument * document) {
        //Do stuff 1
        //Do stuff 2
}];
我的问题:何时可以自动关闭UIManagedDocument?也就是说,文档是否可以(通过OS/SDK)在stuff 1和stuff 2之间关闭?如果用户最小化iPhone应用程序,然后再次打开它会怎么样?
UIManagedDocument
是否将关闭?


另一种表达方式是:当我仍然有一个指向它的强指针时,
UIManagedDocument
会关闭吗?

关于第一个问题,UIManagedDocument何时可以自动关闭?有一个简单的答案是“当iOS认为合适时”。换句话说,当这种情况发生时,你无法控制(除非你自己关闭它,但这不是重点)。但你仍然可以应对这种情况

特别是,在AppDelegate文件中,您可能希望包含一行来保存文档

- (void)applicationWillResignActive:(UIApplication *)application
(如果使用UIManagedDoc,则不需要)

现在,您的应用程序还应该监视UIManagedDocument状态的更改,如“添加UIDocumentStateChangedNotification通知的观察者”行所述

对于你的第二个问题,答案是肯定的。例如:如果您有一个很长的后台操作,并且用户关闭了他/她的手机,那么文档将被关闭。因为您使用的是UIManagedDocument,所以保存是自动完成的,所以您不必担心它处于不一致的状态

如果应用程序进入后台状态,并且stuff1和stuff2之间的内容对应用程序至关重要(例如填充新数据),那么您应该考虑将最关键的部分括在后台任务中

关于你的第三个问题,从以前的状态恢复,这实际上取决于应用程序。苹果已经发布了很多文档。这必须与对UIManagedDocument状态更改(包括冲突)的正确响应结合使用

对于你的最后一个问题,在正常情况下答案是否定的,否则答案是肯定的-内存不足,手机关机-即使你的应用程序在前台

因此,从本质上讲,您无法控制应用程序何时终止(电池耗尽,操作系统关闭?),但您仍然可以以允许您保持数据完整性的方式响应UIManagedDocument更改或应用程序生命周期更改

编辑:谢谢,我不认为它完全回答了你的问题。为了以防万一,你在最初的问题中提到的帖子很好地阐述了重要的问题。特别是,我几乎一字不差地使用它,还添加了我自己的通知,告诉视图何时以及如何刷新。依赖苹果的数据源机制并不总是好的,因为它有时会导致竞争条件,很难解决(例如,当视图不可见时是否应该更新视图…)

所以在这两种方法中

- (void)objectsDidChange:(NSNotification *)notification
{
#ifdef DEBUG
    NSLog(@"NSManagedObjects did change.");
#endif
}

- (void)contextDidSave:(NSNotification *)notification
{
#ifdef DEBUG
    NSLog(@"NSManagedContext did save.");
#endif
}
通知中的用户信息字段告诉您在文档中做了什么,例如:

userInfo = {
    inserted = "{<the Core data fields inserted>}";
    updated = "{<code data fields updated>}";
}}
userInfo={
插入“{}”;
updated=“{}”;
}}
然后更新我认为合适的视图。例如,如果从远程服务器接收新数据,则可以计算插入的新字段数,并更新徽章计数。或者发送通知,以便只更新一个视图,等等

使用UIManagedDoc处理视图间的数据一致性并不困难,但如何在不产生副作用的情况下更新数据却非常棘手

祝你好运