У меня есть приложение на основе 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. Мой вопрос в том, что я могу сделать, чтобы ускорить это или не позволить отставанию быть настолько очевидным?
Возможно ли выполнить код в методе ViewDidAppear и отобразить индикатор активности во время его работы? Таким образом, по крайней мере, пользователь увидит изменение вкладок и узнает, что программа занята извлечением данных. – Scampbell