Jak*_*oni 4 iphone static objective-c ios ios5
我有一个帮助程序类,它分发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;
}
Run Code Online (Sandbox Code Playgroud)
基本上我要做的只是分发UIManagedDocument的一个实例,所以如果核心数据存储有多个编写器,我不必经常保持更改同步.但是,由于磁盘上有多个核心数据存储,因此我不能每次都分配相同的静态变量.
有任何想法吗?我完全坚持甚至如何处理这个设计问题......任何帮助都表示赞赏.
谢谢 - 杰克
好吧,如果你想做我认为你想做的事情:不,这不行.
我假设您想要为所sharedDocument请求的磁盘上的每个唯一文件保留一个,而不管其他任何sharedDocuments存在.但是你的代码不会这样做,因为每次传入的fileName都与fileName中传递的最后一个不同,对old的引用UIManagedDocument就会丢失.
想象一下以下(人为的)情景:
UIManagedDocument *docA = [self sharedManagedDocumentForFile:@"fileA.txt"];
UIManagedDocument *docB = [self sharedManagedDocumentForFile:@"fileB.txt"];
UIManagedDocument *docA2 = [self sharedManagedDocumentForFile:@"fileA.txt"];
Run Code Online (Sandbox Code Playgroud)
您期望docA并且docA2是相同UIManageDocument但不会发生,因为中间行导致您的静态变量忘记原始托管文档file1.txt1.
我放弃使用静态变量.还有很多其他方法可以做到这一点.一种简单的方法是使用an 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;
}
Run Code Online (Sandbox Code Playgroud)
更新
因为sharedManagedDocumentForFile:是一个类方法,所以您不能将其存储docDictionary为类的实例变量.相反,您可以在.m类实现之前在文件中声明它,如下所示:
static NSMutableDictionary *docDictionary = nil;
@implementation MyClass ...
Run Code Online (Sandbox Code Playgroud)
这实际上提供了一个docDictionary存在于类的任何实例之外的单个实例.您的类的实例仍然可以访问它.
的static关键字确保了此docDictionary变量不能在当前编译单元(即源文件)的外部被访问.有关静态及其许多不同含义的更多信息,请参阅C++中的静态与C++中的静态之间的区别等问题.
| 归档时间: |
|
| 查看次数: |
668 次 |
| 最近记录: |