2015-05-23 2 views
0

Итак, я, хотя я наконец-то откос прошивки развития, а затем я сталкиваюсь это ....Раскадровка интерфейс не обновляется сразу

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

После выполнения первоначального импорта я просматриваю каждую точку данных для анализа данных на нем. За это время, которое составляет около 7 секунд, у меня есть индикатор выполнения пользовательского интерфейса, который должен обновляться и заканчиваться по мере обработки данных. Когда обработка завершена, у меня также есть некоторые UILabels, которые должны обновляться.

Ни один из элементов пользовательского интерфейса Я не добавляю обновления до тех пор, пока после завершения обработки не появится длинное (> 5 секунд) и случайное (до 60 секунд).

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

Телефон действительно испытывает высокую загрузку ЦП в течение этого времени обработки, поэтому я задаюсь вопросом, может ли это быть связано.

После получения доступа к данным сердечного ритма в методе viewdidload, метод readHeartRateData называется, его затем обрабатывает отдельно, как следующее:

-(void)readHeartRateData { 
    NSLog(@"Read Heart Rate Data"); 
    HKQuantityType *heartRate = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; 
    NSSortDescriptor *timeSortDescriptor = [[NSSortDescriptor alloc] initWithKey:HKSampleSortIdentifierEndDate ascending:NO]; 

    // construct the query & since we are not filtering the data the predicate is set to nil 
    HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType:heartRate predicate:nil limit:1000000 sortDescriptors:@[timeSortDescriptor] resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) { 
     NSInteger dataPoints = results.count; 
     self.data1.text = [NSString stringWithFormat:@"Total Data Points Collected: %lu", dataPoints];//Does not update straight away 

     for (int i=0; i<dataPoints; i++) { // The 'processing' bit 
      float value1 = (unsigned long)dataPoints; 
      float progress = (i/value1); 
      [self.progressView setProgress:progress animated:YES];// No update until after process finished 
      HKQuantitySample *quantitySample = [results objectAtIndex:i]; 
      NSDate *date = quantitySample.startDate; 
      NSDateFormatter *timeFormatter = [[NSDateFormatter alloc]init]; 
      timeFormatter.dateFormat = @"HH"; 
      NSString *dateString = [timeFormatter stringFromDate: date]; 
      int check = [dateString intValue]; 

      if(check > 0 && check < 8){   
       nightCount = nightCount + 1;    
       HKUnit *beatsPerMinute = [[HKUnit countUnit] unitDividedByUnit:[HKUnit minuteUnit]];    
       HKQuantity *data = quantitySample.quantity;    
       double dataValue = [data doubleValueForUnit:beatsPerMinute];    
       nightTotal = nightTotal + dataValue; 
      } 
     } 
     NSLog(@"Number of Night Data Points: %li", (long)nightCount); 
     nightAverageRate = nightTotal/nightCount; 
     NSLog(@"Average Night Heart Rate: %li",(long)nightAverageRate); 
     self.data4.text = [NSString stringWithFormat:@"Total Night-time Data Points: %lu", (long)nightCount]; 
     self.data5.text = [NSString stringWithFormat:@"Average Night-time BPM: %li", (long)nightAverageRate];   
     // if there is a data point, dispatch to the main queue 
     if (results) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       // NSDate *startDate, *endDate; 

      }); 
     } 
    }]; 

    // do not forget to execute the query after its constructed 
    [healthStore executeQuery:query]; 
} 

Любые предложения о том, почему существует эта случайная задержка после того, как обработка данных закончена прежде чем он обновит метки пользовательского интерфейса и представление прогресса? Загрузка процессора высока с самого начала, но падает, как только обработка завершена. Большое спасибо за чтение

ответ

2

HKSampleQuery выполняется на фоновом потоке и его результатыHandler также выполняется на фоновом потоке.

Из документации (https://developer.apple.com/library/prerelease/ios/documentation/HealthKit/Reference/HKSampleQuery_Class/index.html)

Этот метод выполняет запрос на анонимной очереди фона. Когда запрос завершен, он выполняет обработчик результатов в фоновом режиме. Как правило, вы посылаете эти результаты обратно в основную очередь, чтобы обновить пользовательский интерфейс

Вы возглавляете в правильном направлении с блоком dispatch_async, но вы должны поместить все изменения в пользовательский интерфейс в этом блоке

Причиной случайной задержки является то, что пользовательский интерфейс не будет перерисовываться, пока что-то еще не активирует обновление пользовательского интерфейса. Я поместил деньги на перерисовывание, когда вы нажимаете экран.

+0

Thats great, есть ли способ вызвать перерисовку экрана? – simbo64

+0

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

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