我如何创build一个全局UIManagedDocument实例每个文件在磁盘上由我的整个应用程序使用块共享?

我想devise一个帮助器方法,它将检索一个UIManagedDocument,然后打开并返回它,以便我可以从我的应用程序中的几个地方访问相同的UIManagedDocument。

我对这种asynchronous性质有困难,因为我对块不太熟悉。 理想情况下,事件的顺序是这样的:

  1. X类调用帮助器方法来检索UIManagedDocument,并包含一个代码块,以在打开的文档返回时运行。
  2. 类方法检索UIManagedDocument,并根据需要调用openWithCompletionHandler或saveToURL,并包含一个在打开的文档返回时运行的代码块。
  3. openwithCompletionHandler或saveToURL完成他们的任务,并返回成功=是,并在其代码块中运行代码
  4. 类方法完成其任务,并返回一个打开的UIManagedDocument并在其代码块中运行代码

我可以通过原始块通过某种方式吗?

这是我的代码到目前为止。 任何想法非常感激,谢谢。

// This is a dictionary where the keys are "Vacations" and the objects are URLs to UIManagedDocuments static NSMutableDictionary *managedDocumentDictionary = nil; // This typedef has been defined in .h file: // typedef void (^completion_block_t)(UIManagedDocument *vacation); // The idea is that this class method will run the block when its UIManagedObject has opened @implementation MyVacationsHelper + (void)openVacation:(NSString *)vacationName usingBlock:(completion_block_t)completionBlock { // Try to retrieve the relevant UIManagedDocument from managedDocumentDictionary UIManagedDocument *doc = [managedDocumentDictionary objectForKey:vacationName]; // Get URL for this vacation -> "<Documents Directory>/<vacationName>" NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; url = [url URLByAppendingPathComponent:vacationName]; // If UIManagedObject was not retrieved, create it if (!doc) { // Create UIManagedDocument with this URL doc = [[UIManagedDocument alloc] initWithFileURL:url]; // Add to managedDocumentDictionary [managedDocumentDictionary setObject:doc forKey:vacationName]; } // If document exists on disk... if ([[NSFileManager defaultManager] fileExistsAtPath:[url path]]) { [doc openWithCompletionHandler:^(BOOL success) { // Can I call the completionBlock from above in here? // How do I pass back the opened UIDocument }]; } else { [doc saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) { // As per comments above }]; } } 

您可以使用completionBlock(doc)执行该块。

  [doc openWithCompletionHandler:^(BOOL success) { // Can I call the completionBlock from above in here? // How do I pass back the opened UIDocument completionBlock(doc); }]; 

假设你在类中实现了下面的方法来调用你的openVacation方法:

 -(void)vacationOpened:(UIManagedDocument *)vacation { NSLog(@"My Vacation: %@", vacation.description); } 

一个可以调用openVacation方法的代码行是:

 [MyVacationsHelper openVacation:@"MyVacation1" usingBlock:^(UIManagedDocument *vacation){ [self vacationOpened:vacation]; }]; 

插入后的(UIManagedDocument * vacation)意味着当您使用圆括号表示法执行块时(如completionBlock(doc)) ,则需要列出(UIManagedDocument *)作为参数。 该参数的值将在指定块内被称为休假 。 我在上面的代码示例中做的是在当前类(self)中调用一个方法,并将该parameter passing给该方法,以便我可以根据需要使用它(我只是在这里做了一个NSLog以确保它的工作) 。

我发现了一个非常有用的文章 – “ 具有单个共享UIManagedDocument的核心数据 ”