2013-08-15 13 views
1

У меня есть приложение на основе UITabBarController, которое:Как я могу улучшить эту производительность?

1) Выбирает данные из Интернета и анализирует его на CD (это отлично работает). [На вкладке 1] 2) Затем, когда вторая вкладка [В Tab 2] выбран, он работает этот метод:

{viewDidLoad> loadRecordsFromCD (performBlockAndWait)> populateLocationsToSort}

- (void)populateLocationsToSort { 

    //1. Get UserLocation based on mapview 
    self.userLocation = [[CLLocation alloc] initWithLatitude:self.userLocation.coordinate.latitude longitude:self.userLocation.coordinate.longitude]; 

    // Loop thru dictionary-->Create locations 
    // 2. Loop thru dictionary to get Custom Objects 
    for (Location * locationObject in self.farSiman) { 
     // 3. Unload objects values into locals 

     //PARSE ALL DATA 
     NSString *coordenadas = locationObject.coordenadas; 
     NSArray *coordinatesArray = [coordenadas componentsSeparatedByString:@","]; 
     NSString * latitude = [coordinatesArray objectAtIndex:0]; 
     NSString * longitude = [coordinatesArray objectAtIndex:1]; 
     NSString * storeDescription = locationObject.nombrePublico; 
     NSString * address = locationObject.direccion; 

     NSString * ciudad = locationObject.ciudad; 
     NSString * horario = locationObject.horario; 
     NSString * hor_LV = locationObject.hor_LV; 
     NSString * hor_S = locationObject.hor_S; 
     NSString * hor_D = locationObject.hor_D; 
     NSString * telefono = locationObject.telefono; 
     NSString * celular_TA = locationObject.celular_TA; 
     NSString * celular_TB = locationObject.celular_TB; 
     NSString * hrs24 = locationObject.hrs24; 
     NSString * driveThru = locationObject.driveThru; 

     //NSString * estado = locationObject.estado; 
     NSString * estado; 

     // IF self.open24hrs SELECTED 
     if (self.open24hrs) { 
      // Set it based on TimeComparator 
      if ([TimeComparator dealWithTimeStrings2:locationObject.hor_LV]) { 
       estado = @"Abierta"; 
      } else { 
       estado = @"Cerrada"; 
      } 
     } else { 
      estado = locationObject.estado; 
     } 


     // 4. Create MyLocation object based on locals gotten from Custom Object 
     CLLocationCoordinate2D coordinate; 
     coordinate.latitude = latitude.doubleValue; 
     coordinate.longitude = longitude.doubleValue; 
     MyLocation *annotation = [[MyLocation alloc] initWithName:storeDescription address:address coordinate:coordinate distance:0 ciudad:ciudad horario:horario telefono:telefono hrs24:hrs24 driveThru:driveThru hor_LV:hor_LV hor_D:hor_D hor_S:hor_S celular_TA:celular_TA celular_TB:celular_TB estado:estado]; 

     // 5. Calculate distance between locations & uL 
     CLLocation *pinLocation = [[CLLocation alloc] initWithLatitude:annotation.coordinate.latitude longitude:annotation.coordinate.longitude]; 
      CLLocationDistance calculatedDistance = [pinLocation distanceFromLocation:self.userLocation]; 
     annotation.distance = calculatedDistance/1000; 

     //Add annotation to local NSMArray 
     [self.annotationsToSort addObject:annotation]; 
    } //ENDS FOR LOOP 

    //SORT the created annotationsToSort 
    [self sort]; 

} 

Он принимает массив заполненный с извлечения компакт-диска и создающий объекты из них. Он создает новые объекты, потому что он должен принимать поле hor_LV, анализировать его в датах и ​​сравнивать их до сих пор, чтобы определить location.estado.

В настоящее время выдается 84 записи, и я уже могу заметить задержку с момента, когда я нажимаю вторую вкладку (этот контроллер просмотра таблицы) и время, которое она фактически отображает на экране.

Я не могу предварительно проанализировать этот массив, потому что пользователь устанавливает некоторые фильтры на вкладке 1, которые передаются в Tab 2, прежде чем данные будут извлечены из базы данных. Поэтому я знаю, что выборка должна произойти при загрузке Tab 2. Мой вопрос в том, что я могу сделать, чтобы ускорить это или не позволить отставанию быть настолько очевидным?

+0

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

ответ

1

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

Если вы ищете оптимизацию кода, я бы предложил использовать профилировщик и соответствующим образом изменить код.

1

Посмотрите на использование запрошенного запроса на выборку. Вы не можете одновременно отображать все 84 элемента для пользователя, поэтому вам не нужно вытаскивать их из хранилища данных одновременно. Запрос на выборку можно настроить для сортировки элементов и возврата страниц, подходящих для количества элементов, которые можно просмотреть в любой момент времени. Тогда каждый раз, когда загружается страница, будет очень небольшая часть обработки/преобразования, но общая стоимость будет распределена. Кроме того, если пользователь никогда не «прокручивает», чтобы видеть данные, он не будет загружен.

+0

Насколько я понимаю, вы предлагаете использовать NSFRC? Который только загружает из CoreData записи, отображаемые на экране. Но это будет означать, что когда я загружу запись [0], она будет вызывать TimeComparator для [0]. Но когда он прокручивается сверху, а затем обратно на экран, мне придется снова позвонить TimeComparator. Это процесс, делающий его медленным. – marciokoko

+0

Вы можете посмотреть на сохранение этих данных в переходных атрибутах в объекте модели или, возможно, на кеширование в массиве. Опять же, дело не в том, чтобы загрузить все это одновременно. – Wain

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