我有一个UITabBarController
,其中UITableViewControllerA列表文件和UITableViewContollerB显示正在上传的文件的进度。
我有一个Singleton类,其上传方法调用我的子类AFHTTPClient
并使用NSNotificationCenter
通知我的UITableViewControllerB上传进度。但目前这种方式正在将UI降低到几乎无法使用的地步,我不确定如何改进流程。我读到在主线程上调用了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 :(得分:1)
您要发送许多通知。重新加载tableview单元是一种有点昂贵的操作。我会限制通知的发布仅在完整百分点发生变化时或每秒只发送一次。 你可以玩最适合自己的东西,但是8300通知对于tableview来说是很有用的。
答案 1 :(得分: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;
}
}