2013-08-07 2 views
1

У меня есть UITabBarController, где файлы UITableViewControllerA и UITableViewContollerB показывают ход загрузки файлов.AFNetworking несколько загрузок замедления основной нити

У меня есть класс Singleton с методом загрузки, который вызывает мой подкласс AFHTTPClient и использует NSNotificationCenter для уведомления моего UITableViewControllerB о ходе выполнения загрузки. Но этот текущий способ замедляет работу пользовательского интерфейса, где он почти не используется, и я не уверен, как я могу улучшить процесс. Я читал, что функции обратного вызова AFNetworking вызываются в основном потоке. Является ли медленный ответ UI из моего NSNotificationCenter?

Я также хотел бы упомянуть, что я запускаю это на Симуляторе.

Метод от моего класса Singleton.

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
[dict setObject:uniqueName forKey:@"unique"]; 
[dict setObject:[NSNumber numberWithFloat:0] forKey:@"progress"]; 

[self.active addObject:dict]; 

[[CustomHTTP client] uploadFileName:@"filename" withBytes:data toPath:serverPath progress:^(float progress) { 
    [dict setObject:progress forKey:@"progress"]; 

    NSMutableDictionary *info = [[NSMutableDictionary alloc] init]; 
    [info setObject:[NSNumber numberWithInt:[self getIndexByUniquename:uniqueName]] forKey:@"row"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ProgressNotification" object:self userInfo:info]; 

} success:^(AFHTTPRequestOperation *operation, id responseObject) { 

} andFailure:^(AFHTTPRequestOperation *operation, NSError *error) { 

}]; 

UITableViewControllerB.m

- (void) receiveTestNotification:(NSNotification *) notification { 

if ([[notification name] isEqualToString:@"ProgressNotification"]) { 
    NSDictionary *dict = notification.userInfo; 

    int row = [[dict objectForKey:@"row"] intValue]; 

    self.inProgress = [Transfer defaultTransfer].active; 

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0]; 
    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
          withRowAnimation:UITableViewRowAnimationNone]; 

} 
} 
+0

Сколько загрузок вы используете одновременно? Используйте инструменты, чтобы увидеть, что происходит. – Wain

+0

@Wain Я запускал 2 загрузки 30 МБ +. Какой инструмент я должен использовать? –

+0

Используйте диапазон, проверьте использование процессора (профилирование времени) и использование памяти. 2 загрузки одновременно должны быть в порядке. Сколько обновлений прогресса вы получаете. – Wain

ответ

0

Вместо того, чтобы звонить reloadRowsAtIndexPaths Я изменил его, чтобы найти ячейку и обновить ярлык таким образом.

for (int i = 0; i < [self.items count]; i++) { 
     if ([self.items objectAtIndex:i] == transfer) { 
      NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; 
      TransferCell *cell = (TransferCell *)[self.tableView cellForRowAtIndexPath:indexPath]; 
      cell.percentLabel.text = transfer.completed; 
      break; 
     } 
    } 
1

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

+0

Когда я нахожусь на своем компьютере, я дам этот снимок. Спасибо, karlofk! –

+0

Если этот ответ правильный, отметьте его так. Благодаря! – karlofk

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