Iphone AFN网络化多个上载减慢了主线程

Iphone AFN网络化多个上载减慢了主线程,iphone,ios,afnetworking,Iphone,Ios,Afnetworking,我有一个UITabBarController,其中UITableViewControllerA列出文件,uitableviewcontrollerb显示上传文件的进度 我有一个带有上载方法的单例类,该方法调用我的子类AFHTTPClient,并使用NSNotificationCenter通知UITableViewControllerB上载进度。但目前的这种方式正在将UI拖慢到几乎无法使用的地步,我不确定如何改进这个过程。我读到在主线程上调用了AFN回调函数。是我的NSNotificationCe

我有一个
UITabBarController
,其中UITableViewControllerA列出文件,uitableviewcontrollerb显示上传文件的进度

我有一个带有上载方法的单例类,该方法调用我的子类
AFHTTPClient
,并使用
NSNotificationCenter
通知UITableViewControllerB上载进度。但目前的这种方式正在将UI拖慢到几乎无法使用的地步,我不确定如何改进这个过程。我读到在主线程上调用了AFN回调函数。是我的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];

}
}

您正在发送许多通知。重新加载tableview单元格是一项成本较高的操作。我会将通知的发布限制为仅当一个完整的百分点发生变化时,或仅每秒发布一次。
您可以选择最适合自己的方式,但对于tableview来说,8300通知的处理量太大了

您正在发送许多通知。重新加载tableview单元格是一项成本较高的操作。我会将通知的发布限制为仅当一个完整的百分点发生变化时,或仅每秒发布一次。
您可以选择最适合自己的方式,但对于tableview来说,8300通知的处理量太大了

我没有调用
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;
        }
    }
for(int i=0;i<[self.items count];i++){
if([self.items objectAtIndex:i]==传输){
NSIndexPath*indexPath=[NSIndexPath indexPathForRow:i第1节:0];
TransferCell*cell=(TransferCell*)[self.tableView cellForRowAtIndexPath:indexPath];
cell.percentLabel.text=transfer.completed;
打破
}
}

我没有调用
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;
        }
    }
for(int i=0;i<[self.items count];i++){
if([self.items objectAtIndex:i]==传输){
NSIndexPath*indexPath=[NSIndexPath indexPathForRow:i第1节:0];
TransferCell*cell=(TransferCell*)[self.tableView cellForRowAtIndexPath:indexPath];
cell.percentLabel.text=transfer.completed;
打破
}
}

您同时运行了多少次上载?使用仪器查看发生了什么。@Wain I正在运行2次30MB+上传。我应该使用哪种仪器?使用量程,检查处理器使用情况(时间分析)和内存使用情况。2同时上传应该是可以的。您获得了多少个进度更新。@Wain对于我的34MB文件,8300个进度更新。仅在特定时间段进行更新,例如每0.2秒更新一次UI应该正常、平滑且仍有响应。您同时运行了多少次上载?使用仪器查看发生了什么。@Wain I正在运行2次30MB+上传。我应该使用哪种仪器?使用量程,检查处理器使用情况(时间分析)和内存使用情况。2同时上传应该是可以的。您获得了多少进度更新。@Wain对于我的34MB文件,8300个进度更新。仅在特定时间段进行更新,例如每0.2秒更新一次UI应该是正常的、平滑的,并且仍然响应。当我在电脑旁时,我会尝试一下。谢谢你,卡洛夫!当我在电脑旁时,我会尝试一下。谢谢你,卡洛夫!