2013-05-30 5 views
1

У меня есть следующий код:C Объектив выборки не всегда возвращает результат

-(void) readAllQuestions { 
    NSLog(@"Reading questions from database"); 

    NSManagedObjectContext* moc = self.questionsDocument.managedObjectContext; 
    moc.mergePolicy = NSRollbackMergePolicy; 

    NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"QuestionEntity"]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"modified" ascending:YES]; 
    request.sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 

    NSError *error; 
    NSArray* results = [moc executeFetchRequest:request error:&error]; 
    if (error) { 
     NSLog(@"Error: %@", [error localizedDescription]); 
    } 
    NSLog(@"Read %d question entities", [results count]); 
    self.questionsArray = results; 
} 

questionsDocument является UIManagedDocument

Моя проблема в том, что этот код не всегда возвращают объекты. На самом деле это на самом деле никогда не делает это в первый раз, когда я это называю. Когда я это называю второй раз, он работает, а также когда я отлаживаю.

Таким образом, я думаю, что проблема asyn продолжается.

Кто может мне помочь?

инициализатор:

-(id)init { 
    if (self = [super init]) { 
     [self openDocumentIfItExistsOrCreateNew]; 
     [self readAllQuestions]; 
    } 
    return self; 
} 

код для открытия документа:

-(void) openDocumentIfItExistsOrCreateNew { 
    QuestionsDocument* document = [self createDocument]; 

    if (![[NSFileManager defaultManager] fileExistsAtPath:document.fileURL.path]) { 
     [self addDocument:document]; 
    } 
    [document openWithCompletionHandler:^(BOOL success) { 
     if (success == NO) { 
      [NSException 
      raise:NSGenericException 
      format:@"Could not open the file %@ at %@", 
      FILE_NAME, 
      document.fileURL]; 
     } 
    }]; 

    self.questionsDocument = document; 
} 

ответ

1

openWithCompletionHandler работает асинхронно, что означает, что он инициирует только открытие документа в фоновом режиме. Блок обработчика завершения называется позже, когда документ фактически был открыт.

Таким образом, вы не можете позвонить [self readAllQuestions] непосредственно после [self openDocumentIfItExistsOrCreateNew]. Вы можете, например, переместить это в блок обработчика завершения:

[document openWithCompletionHandler:^(BOOL success) { 
    if (success) { 
     [self readAllQuestions]; 
     ... update UI (reload table view or whatever you have) ... 
    } else { 
      // report error 
    } 
}]; 
0

Этот код

NSArray* results = [moc executeFetchRequest:request error:&error]; 
if (error) { 

не является правильным.

сделать что

if (results == nil) { 
    NSLog (@"%@", [error localizedDescription]); 
+0

Спасибо, я использую ваше решение сейчас! –

Смежные вопросы