1

UITableViewControllerAにはファイルのリストがありUITabBarController、UITableViewContollerB にはファイルのアップロードの進行状況が表示されます。

サブクラスを呼び出し、アップロードの進行状況を UITableViewControllerB に通知するためにAFHTTPClient使用するアップロード メソッドを持つシングルトン クラスがあります。NSNotificationCenterしかし、この現在の方法では、UI がほとんど使用できないほど遅くなり、プロセスを改善する方法がわかりません。AFNetworking コールバック関数がメイン スレッドで呼び出されることを読みました。NSNotificationCenter からの遅い UI 応答ですか?

また、これをシミュレーターで実行していることにも言及したいと思います。

私の 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];

}
}
4

2 に答える 2

1

多くの通知を送信しています。テーブルビュー セルのリロードは、ややコストのかかる操作です。通知の投稿は、完全なパーセント ポイントが変化したときのみ、または 1 秒ごとに 1 つだけに制限します。自分に最適なものを試してみることができますが、8300 の通知は tableview で処理するには多すぎます。

于 2013-08-07T10:01:21.197 に答える
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;
        }
    }
于 2013-12-13T02:57:41.593 に答える