2012-02-09 4 views
11

Я пытаюсь создать вспомогательный метод, который будет извлекать UIManagedDocument, а затем открыть и вернуть его, чтобы я мог получить доступ к тому же UIManagedDocument из нескольких мест в моем приложении.Как создать глобальный экземпляр UIManagedDocument для каждого документа на диске, общий для всего моего приложения, используя блоки?

У меня возникают проблемы с асинхронным характером этого, поскольку я не слишком знаком с блоками. В идеале последовательность событий будет такой:

  1. Класс X вызывает вспомогательный метод для получения UIManagedDocument и включает блок кода для запуска при возврате открытого документа.
  2. Метод класса извлекает UIManagedDocument и при необходимости вызывает openWithCompletionHandler или saveToURL и включает блок кода для запуска при возврате открытого документа.
  3. openwithCompletionHandler или saveToURL завершить свою задачу и вернуться с успехом = YES и запустить код в блоке
  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 
     }]; 

    } 

} 

ответ

7

Вы можете выполнить блок с завершениемBlock (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) после каретки означает, что при выполнении блока с использованием скобок обозначение - как в completeBlock (doc) - вам необходимо указать (UIManagedDocument *) в качестве параметра. Значение этого параметра будет называться Отпуск внутри указанного блока. То, что я сделал в примере с моим блочным кодом, было вызовом метода в моем текущем классе (self) и передать параметр вместе с этим методом, чтобы я мог использовать его по мере необходимости (я просто сделал NSLog здесь, чтобы убедиться, что он сработал) ,

+0

Разбил его из парка, хорошая работа, работает, как сон! – Alan