2014-10-08 3 views
1

Я только что начал тестировать CloudKit, и у меня довольно медленные запросы. Вот пример кода, который я использую:CloudKit Query Time

//CLOUDKIT 
    CKContainer *container = [CKContainer defaultContainer]; 
    CKDatabase *privateDatabase = [container privateCloudDatabase]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"TRUEPREDICATE"]; 
    CKQuery *query = [[CKQuery alloc] initWithRecordType:@"FlightLog" predicate:predicate]; 

    [privateDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) { 
     //SUCCESS 
     if (!error) 
     { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"SUCCESS" message:@"IT WORKED" delegate:self cancelButtonTitle:@"dismiss" otherButtonTitles:nil]; 
      [alert show]; 

      NSLog(@"%@", @"fetchFlights success!"); 
      NSLog(@"%@", self.fetchedRecords); 

      self.fetchedRecords = results; 
      [self.tableView reloadData]; 
     } 
     //ERROR 
     else 
     { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"error" message:error.localizedDescription delegate:self cancelButtonTitle:@"dismiss" otherButtonTitles:nil]; 
      [alert show]; 

      NSLog(@"%@", error); 
     } 

    }]; 

Я получаю частную базу данных и запрашиваю для всех записей. В панели инструментов есть только четыре простых.

После вызова этого кода из моего журнала консоли видно, что сообщение об успешном вызове вызывает почти сразу, с нулевым массивом результатов. Затем через несколько минут результаты возвращаются, как видно из журнала. Однако представление предупреждения не отображается, и результаты отображаются в моей таблице примерно на 3-4 секунды.

Что происходит ?!

Спасибо.

+0

вы регистрируете извлеченные записи перед назначением им результатов. Этот обратный вызов также вызывается в фоновом потоке. Вы должны вызвать allertview из основного потока. –

+0

Упс! Но если я не могу называть мой код «done» в блоке завершения, в чем смысл блока соревнований? Я решил это, поставив 'reloadData' моего tableview, обратно в основной поток. См. Мой ответ. –

ответ

1

Решено. Как упоминает Эдвин, я не знал, что обратный вызов находится в фоновом потоке. Поэтому, когда я вызываю [self.tableView reloadData] в блок завершения, он также работает в фоновом потоке.

Поставив его обратно на главную нить, просмотр таблицы перезагружается в течение примерно секунды. Vs занимает около 4-5 секунд, если работает в том же потоке, что и обратный вызов.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
          [self.tableView reloadData]; 
         }); 
    }); 

Сообщите мне, что я неправильно понял, но я думаю, что это произошло.

+0

прохладный ... проблема решен! –

+0

Я использовал: dispatch_async (dispatch_get_main_queue(),^{[thisAlert show];}); где следующее, что я хотел сделать, это показать предупреждение. –