2012-01-17 54 views
4

我有一个助手类,分发UIManagedDocument的共享实例。这个想法是用户为磁盘上的特定文件请求UIManagedDocument共享实例。在这种情况下,它是一个核心数据存储。如果用户请求位于不同路径的核心数据存储,我想为该文件分发UIManagedDocument的实例。如何使用类方法分发UIManagedDocument的多个共享实例?

我的问题是:可以创建一个UIManagedDocument的新实例,并在文件更改时将其分配给静态变量吗?例如:

+ (UIManagedDocument *)sharedManagedDocumentForFile:(NSString *)fileName 
{ 
    static UIManagedDocument *sharedDocument = nil; 

    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    url = [url URLByAppendingPathComponent:fileName]; 
    // url is "<Documents Directory>/<vacationName>" 

    // Create the shared instance lazily upon the first request. 
    if (sharedDocument == nil) { 
     sharedDocument = [[UIManagedDocument alloc] initWithFileURL:url]; 
    } 

    if (sharedDocument.fileURL != url) { 
     UIManagedDocument *newDocument = [[UIManagedDocument alloc] initWithFileURL:url]; 
     sharedDocument = newDocument; 
    } 

    return sharedDocument; 
} 

基本上我试图做这样的事件有多个作家的核心数据存储,我没有要不断保持变化中分发UIManagedDocument只有一个实例同步。但是,由于磁盘上有多个核心数据存储,我不能每次都分配相同的静态变量。

任何想法?我绝对坚持甚至如何解决这个设计问题......任何帮助表示赞赏。

谢谢 - 杰克

+5

我相信这是一个强制性的句子。 – PengOne 2012-01-17 23:16:43

+0

@JV V我觉得他在开玩笑......大声笑 – bschultz 2012-01-17 23:19:09

+0

你说'ok'和'legal'是什么意思? – occulus 2012-01-17 23:30:29

回答

6

好吧,如果你想要做什么,我认为你要做到:不,这是行不通的。

我假设你想要坚持一个sharedDocument为磁盘上请求的每个独特的文件,独立于任何其他sharedDocuments存在。但是你的代码不会那样做,因为每次传入的fileName与fileName中传递的最后一次不同时,旧的UIManagedDocument的引用将丢失。

想象一下以下的(人为)场景:

UIManagedDocument *docA = [self sharedManagedDocumentForFile:@"fileA.txt"]; 
UIManagedDocument *docB = [self sharedManagedDocumentForFile:@"fileB.txt"]; 
UIManagedDocument *docA2 = [self sharedManagedDocumentForFile:@"fileA.txt"]; 

你期待docAdocA2是相同UIManageDocument,但是这不会发生,因为中间线引起您的静态变量忘记了原来的管理文件为file1.txt1

我会放弃使用静态变量。还有很多其他的方法可以做到这一点。一个简单的方法是使用NSMutableDictionary从文件名映射到UIManagedDocument实例。事情是这样的:

+ (UIManagedDocument *)sharedManagedDocumentForFile:(NSString *)fileName 
{ 
    //assuming we have an instance variable: NSMutableDictionary *docDictionary 
    UIManagedDocument *doc = [docDictionary objectForKey:fileName]; 

    if (!doc) { 
     NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
     url = [url URLByAppendingPathComponent:fileName]; 
     // url is "<Documents Directory>/<vacationName>" 

     doc = [[UIManagedDocument alloc] initWithFileURL:url]; 

     [docDictionary setObject:doc forKey:fileName]; 
    } 
    return doc; 
} 

更新

因为sharedManagedDocumentForFile:是一个类的方法,你不能存储docDictionary为你的类的实例变量,你注意。相反,你可以你的类实现之前在.m文件中这样声明:

static NSMutableDictionary *docDictionary = nil; 

@implementation MyClass ... 

这实际上给出了存在于您的任何类实例的外单docDictionary实例。你的类的实例仍然可以访问它。

static关键字可确保此变量不能在当前编译单元(即源文件)之外访问。有关静态和其多种含义的更多信息,请参阅Difference between static in C and static in C++??

+0

Occulus - 感谢您的回复。你提出的是一个更好的解决方案,因为你解释你的例子的原因。有一件事我不明白。如果'sharedManagedDocumentForFile'是一个类方法,我们如何访问实例变量docDictionary? – 2012-01-18 01:59:18

+0

Godo问题。更新我的答案。 – occulus 2012-01-18 12:22:30

+0

谢谢! ..我已经实现了这一点,它似乎是完美的工作。 – 2012-01-18 19:13:39

0

这样的问题我想通了。使用setObject,而不是addObject。

相关问题