如何在不同的对象之间共享一个UIManagedDocument?

5
我已经查看了如何使用块创建一个全局UIManagedDocument实例,以便整个应用程序共享,但我并不是很理解。
我的目标是整个应用程序只有一个UIManagedDocument - 一个核心数据数据库。不同的对象应该调用一个方法并获取唯一的UIManagedDocument。
我使用一个带有类方法的帮助器类:
+ (UIManagedDocument *)getsharedDatabase:(NSString *)databaseName
{
    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:databaseName];
    // url is now "<Documents Directory>/<databaseName>"

    if (![[NSFileManager defaultManager] fileExistsAtPath:[url absoluteString]])
    {
        // does not exist on disk, so create one
        UIManagedDocument *managedDocument = [[UIManagedDocument alloc] initWithFileURL:url];

        return managedDocument;
    }
    else
    {
        UIManagedDocument *managedDocument = **?????**

        return managedDocument;
    }
}

从问号可以看出,我不知道如何获取现有的文件。我查看了UIManagedDocument类参考文档,但没有找到它。

请帮帮我,非常感谢。

编辑 我在想...那么一个单例方法怎么样呢:

+ (UIManagedDocument *) sharedDatabase
{
    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:@"databaseName"];
    // url is now "<Documents Directory>/databaseName"

    static UIManagedDocument *managedDocument = nil;
    static dispatch_once_t mngddoc;

    dispatch_once(&mngddoc, ^{
            managedDocument = [[UIManagedDocument alloc] initWithFileURL:url];
    });

    return managedDocument;
}

你的单例方法看起来是可行的。你可以将URL创建代码移动到dispatch_once内部以进行优化。 - Felix
太好了,谢谢。要归功于Colin Wheeler:他是我的灵感来源 - https://dev59.com/13I95IYBdhLWcg3wsQBm#2200751 - uem
1个回答

0
如果您在磁盘上有现有的UIManagedDocuments,则需要搜索目录以查找匹配的文件。通常,这些文件会具有某些标识属性,例如共同的文件扩展名。
类似于以下内容:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSURL *appDirectoryURL = [appDelegate applicationDocumentsDirectory];
NSArray *directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:appDirectoryURL includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsHiddenFiles error:nil];

for (NSURL *fileURL in directoryContents) {
    NSString *documentExtension = [fileURL pathExtension];

    if ([documentExtension isEqualToString:@"myfileextension"]) {
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接