RestiKit делает iPhone слишком медленным при загрузке

Я подключаюсь через WIFI с моего iPhone к веб-службе, установленной локально на моем Mac.

Я загружаю четыре набора данных в 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:

-(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 для загрузкиEventos

-(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];

}

Методы делегата табличного представления:

- (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;
}

person David Casillas    schedule 28.02.2012    source источник
comment
И вы ожидаете, что люди будут отвечать на ваш вопрос просто так, не видя вашего кода?   -  person lawicko    schedule 28.02.2012
comment
Иногда есть простой ответ без необходимости вставлять строки и строки кода. Может быть, вы правы, и лучше сделать это заранее, чтобы не терять время. Извиняюсь.   -  person David Casillas    schedule 28.02.2012
comment
Можете ли вы опубликовать методы делегата tableview? Если прокрутка табличного представления медленная, это обычно связано с методами делегата.   -  person Damon Aw    schedule 29.02.2012
comment
Я опубликую их, но, как я уже упоминал, это происходит медленно только при загрузке данных с помощью RestKit, после завершения tableView работает свободно.   -  person David Casillas    schedule 29.02.2012


Ответы (2)


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

person LJ Wilson    schedule 28.02.2012

RestKit не имеет ничего общего с проблемой. После загрузки данных у меня есть цикл, обрабатывающий каждый загруженный элемент (около 400 раз). В то время как симулятор может зацикливаться 100 раз в секунду, устройство может обрабатывать только 4 раза в секунду. Мне нужно выяснить, что происходит, но я открою новую тему по этому поводу, так как это другая проблема, чем оригинал.

person David Casillas    schedule 29.02.2012