Как создать глобальный экземпляр 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
        }];

    }

}

person Alan    schedule 09.02.2012    source источник


Ответы (2)


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

person kevinpo    schedule 09.02.2012

Я нашел довольно полезную статью - "Core Данные с одним общим UIManagedDocument"

person acecapades    schedule 17.10.2012
comment
Автор больше не рекомендует делать это с помощью uimanageddocument. - person smileBot; 03.09.2013