2013-08-15 3 views
1

다음과 같은 UITabBarController 기반 앱이 있습니다.어떻게 성능을 향상시킬 수 있습니까?

1) 웹에서 데이터를 가져 와서이를 CD로 파싱합니다 (정상적으로 작동합니다).

{있는 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]; 

} 

그것은 어레이를 취 [탭 2 년] 선택이어서 두 번째 탭 2) 표 1에서, 이는이 방법을 실행 CD에서 채워지고 객체를 만듭니다. hor_LV 필드를 취하여 날짜로 구문 분석하고 지금 비교하여 위치를 확인해야하기 때문에 새로운 객체를 만듭니다.

현재 84 개의 레코드가 가져오고 있고 두 번째 Tab (이 tableviewcontroller)을 탭하는 순간부터 이미 지연이 있음을 알 수 있으며 화면에 실제로 표시되는 시간입니다.

사용자가 데이터베이스에서 데이터를 가져 오기 전에 Tab 2에 전달 된 일부 필터를 Tab 2에 설정했기 때문에이 배열을 미리 구문 분석 할 수 없습니다. 그래서 나는 그 가져 오기가 탭 2로드로 발생해야합니다 알아요. 내 질문은,이 속도를 높이거나 지연을 그렇게 명백하게하지 않으려면 어떻게해야합니까?

+0

ViewDidAppear 메서드에서 코드를 실행하고 작동하는 동안 활동 표시기를 표시 할 수 있습니까? 그러면 최소한 사용자는 탭 변경 사항을보고 프로그램이 데이터 페치 중임을 알 수 있습니다. – Scampbell

답변

1

데이터를보다 신속하게 처리하기 위해 스레드를 사용하는 것이 가장 좋습니다. 또한 지연을 거의 느끼지 못하게 만들거나 적어도 덜 짜증나게 만드는 피드백을 사용자에게 줄 수있는 기회를 제공합니다. 특히 모든 정보가 아직 처리되지 않은 경우에도 데이터를 보내는 것을 고려하면 더욱 그렇습니다.

코드 최적화를 원한다면 프로파일 러를 사용하고 이에 따라 코드를 수정하는 것이 좋습니다.

1

일괄 반입 요청을 사용하십시오. 동시에 84 개 이상의 항목을 모두 사용자에게 표시 할 수 없으므로 동시에 모든 항목을 데이터 저장소에서 가져올 필요가 없습니다. 가져 오기 요청은 항목을 정렬하고 언제든지 볼 수있는 항목 수에 적합한 페이지를 반환하도록 구성 할 수 있습니다. 그런 다음 페이지가로드 될 때마다 처리/변환의 양이 매우 적지 만 전체 비용이 분배됩니다. 또한 사용자가 데이터를보기 위해 '스크롤'하지 않으면로드되지 않습니다.

+0

내가 이해 한 바로는 NSFRC를 사용하도록 제안하는 것입니까? CoreData에서로드되는 것은 화면에 표시되는 레코드뿐입니다. 그러나 이것은 레코드 [0]을로드 할 때 [0]에 대해 TimeComparator를 호출한다는 것을 의미합니다. 그러나 화면에서 화면을 스크롤 한 다음 다시 화면으로 돌아 왔을 때 TimeComparator를 다시 호출해야합니다. 느린 속도로 진행되는 프로세스입니다. – marciokoko

+0

모델 객체의 임시 속성에 해당 데이터를 저장하거나 배열에 캐싱 할 수 있습니다. 다시 말하지만, 요점은 동시에 모든 것을로드하지 않는 것입니다. – Wain

관련 문제