2012-02-28 3 views
1

내 iPhone에서 WIFI를 통해 Mac에 설치된 webService에 연결하고 있습니다.RestiKit으로 다운로드하는 동안 iPhone이 너무 느려집니다.

다른 요청으로 각각 4 개의 데이터 집합을 TableView에로드합니다. 첫 번째 다운로드가 완료되면 TableView에 데이터를로드하고 다음 다운로드를 계속 진행합니다.

RestKit이 작동하는 동안 앱이 거의 종료되었습니다. TableView를 간신히 스크롤 할 수 있으며 다운로드 프로세스가 완료 될 때까지 기다려야만 작동 할 수 있습니다.

내 장비에서 RestKit을 너무 무겁게 만들 수 없으므로 어떻게 작업하는 동안 데이터를 조용히 다운로드 할 수 있습니까?

편집 :

콘솔 장치에 다음과 같은 메시지를 실행할 때 내가 통지를 가지고 : 나는 여전히 의미를 얻으려고

warning: Unable to read symbols for /Users/david/Library/Developer/Xcode/iOS DeviceSupport/4.2.1 (8C148)/Symbols/usr/lib/info/dns.so (file not found). 
warning: No copy of dns.so found locally, reading from memory on remote device. This may slow down the debug session. 

.

AppDelegate. AEMEventosList를 초기화하고 downloadEventos 메소드를 호출하여 다운로드를 시작합니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 


    //Original code 
    AEMMasterViewController *masterViewController = [[[AEMMasterViewController alloc] initWithNibName:@"AEMMasterViewController" bundle:nil] autorelease]; 

    //Inicializar lista de eventos 
    AEMEventosList *aux = [[AEMEventosList alloc] init]; 
    aux.delegate = masterViewController; 

    //Asignar la lista de eventos a la variable miembro de la clase 
    self.eventosList = aux; 
    [aux release]; 

    // Comenzar la descarga de eventos desde el servidor 
    [self.eventosList downloadEventos]; 

    //Orignal code 
    self.navigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease]; 
// self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0.71 green:0.45 blue:0.05 alpha:1]; 
    self.window.rootViewController = self.navigationController; 
    [self.window makeKeyAndVisible]; 


    return YES; 
} 

AEMEventosList INTI 방법 :

-(id)init { 
    self = [super init]; 
    if (self) {  
     self.eventos = [NSMutableDictionary dictionary]; 
     self.downloadingEventosGroupFlag = 0; 
     self.eventosGroupNames = [NSArray arrayWithObjects: 
              kEventosToday, 
              kEventosInAWeek, 
              kEventosInAMonth, 
              kEventosLaterThanAMonth, 
              nil]; 

     //Iniciar el manager 
     self.manager = [RKObjectManager objectManagerWithBaseURL:kRestURL]; 

     //Mapeo de atributos JSON a miembros de la clase AEMEvento 
     RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[AEMEvento class]]; 
     [mapping mapAttributes: 
     kIdEvento, 
     kNombreEvento, 
     kEntradilla, 
     kDescripcion, 
     kDiaDeInicio, 
     kDiaDeFin, 
     kHorarioTexto, 
     kIdFuente, 
     kNombreFuente, 
     kFotoURL, 
     kWebURL, 
     kUbicaciones, 
     kHorarios, 
     kDiaDeInicioYFinTexto, 
     nil]; 


     //Especificar el mapeo de fechas 
     NSDateFormatter* dateFormatter = [NSDateFormatter new]; 
     [dateFormatter setDateFormat:kDateFormatStringForJson]; 
     [dateFormatter setTimeZone:[NSTimeZone defaultTimeZone]]; 
     mapping.dateFormatters = [NSArray arrayWithObject:dateFormatter]; 
     [dateFormatter release];  

     //Asignar el mapeo al manager siempre que se encuentre la clave "eventos" en el archivo JSON 
     [self.manager.mappingProvider setMapping:mapping forKeyPath:kEventos];   
    } 
    return self; 
} 

AEMEventosList downloadEventos 방법

-(void)downloadEventos {    

    //Iniciar la descarga del grupo de eventos indicado por el atributo downloadingEventosGroupFlag 
    [self.manager loadObjectsAtResourcePath:[self.eventosGroupNames objectAtIndex:self.downloadingEventosGroupFlag] delegate:self]; 

    //Enviar al delegado el mensaje de incio de descarga para que muestre la vista con el indicador de progreso. 
    [self.delegate AEMEventosListDidStartLoadingEventos:self]; 

} 

테이블보기 위임 Mehods :

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return [self.eventosList.eventos count]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [[self.eventosList.eventos objectForKey:[self.eventosList.eventosGroupNames objectAtIndex:section]] count]; 
} 

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     return 80; 
    } 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    switch (section) { 
     case 0: 
      return NSLocalizedString(@"Today", @"Today's events tableview section title."); 
      break; 
     case 1: 
      return NSLocalizedString(@"In a week", @"In a week's events table view section title."); 
      break; 
     case 2: 
      return NSLocalizedString(@"In a month", @"In a month's events tableview section title."); 
      break; 
     case 3: 
      return NSLocalizedString(@"Later than a month" , @"Later than a month events tableview section title."); 
      break; 
     default: 
      return nil; 
      break; 
    } 

} 

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    //Obtener el evento de la lista para la celda 
    NSArray *aux = [self.eventosList.eventos objectForKey:[self.eventosList.eventosGroupNames objectAtIndex:indexPath.section]]; 
    AEMEvento *auxEvento = [aux objectAtIndex:indexPath.row]; 


    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;   

     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

     cell.textLabel.textColor = [UIColor colorWithRed:0.2 green:0.3 blue:0.5 alpha:1]; 
     cell.textLabel.font = [UIFont systemFontOfSize:13]; 
     cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; 
     cell.textLabel.numberOfLines = 2; 

     cell.detailTextLabel.textColor = [UIColor lightGrayColor]; 
     cell.detailTextLabel.font = [UIFont systemFontOfSize:11]; 
     cell.detailTextLabel.textAlignment = UITextAlignmentRight; 
    } 

    // Configure the cell. 
    cell.textLabel.text = auxEvento.nombreEvento; 
    cell.detailTextLabel.text = auxEvento.diaDeInicioYFinTexto; 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"iconGijonBlanco" ofType:@"png"]; 
    cell.imageView.image = [UIImage imageWithContentsOfFile:path]; 
    return cell; 
} 

// Override to support conditional editing of the table view. 
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Return NO if you do not want the specified item to be editable. 
    return NO; 
} 
+0

그리고 코드를 보지 않고도 사람들이 질문에 답변 할 것으로 기대합니까? – lawicko

+0

때로는 라인과 코드 줄을 붙여 넣지 않고도 쉽게 대답 할 수 있습니다. 어쩌면 당신이 옳고 더 나은 것을 미리 넣어두면 시간을 잃지 않을 것입니다. 죄송합니다. –

+0

tableview 대리자 메서드를 게시 할 수 있습니까? 테이블 뷰의 스크롤이 느린 경우 일반적으로 대리자 메서드로 인해 발생합니다. –

답변

0

RestKit은 문제와 아무 관련이 없습니다. 데이터를로드 한 후 다운로드 한 각 요소를 처리하는 루프가 있습니다 (약 400 회). 시뮬레이터가 초당 100 회 반복 할 수 있지만 장치는 초당 4 회만 처리 할 수 ​​있습니다. 무슨 일이 일어나는지 검색해야하지만 원본보다 다른 문제가 있기 때문에 새 스레드를 열어 두겠습니다.

0

당신은 당신이 전화를 사용하는 코드를 게시 할 수 다시 끝나면 요청을 처리하는 데 사용하는 코드는 물론 퀘스트도 포함됩니까? 이를 보지 않고는 비동기를 사용하고 요청을 백그라운드 스레드에 전달하는 대신 요청을 인스턴스화하고 기본 스레드에서 실행하는 것처럼 들립니다.