iOS,UITableView中的延迟显示,带有insertRowsAtIndexPaths:withRowAnimation:

时间:2013-05-16 18:43:42

标签: uitableview nsoperationqueue

我有一个自定义NSObject类,做一些FTP工作(显示,传输...)。

此FTP类具有downloadFiles:方法,该方法在NSOperationQueue内启动。

我希望这种方法能够在UITableView中提供一些结果作为数据源。所以我决定将这些结果委托给UITableViewController

所以FTP类的协议:

@protocol FTPDelegate;

...

@interface FTP...    
@property (nonatomic, weak) id <FTPDelegate> delegate;

...

@protocol FTPDelegate
-(void)FTPMessageReceived: (NSString *)message;
@end

然后我将自定义UITableViewController声明为FTP类的委托:

self.myFTP = (FTP *) [self FTPManager];

self.myFTP.delegate = self;

因此,当FTP类的downloadFiles:方法想要在UITableView中显示某些消息时,它会调用:

[[self delegate] FTPMessageReceived:@"dir created"];

UITableViewController实现了该方法:

-(void)FTPMessageReceived: (NSString *)message {
  NSUInteger index;
  NSArray * indexArray;
  [[self logLine] addObject: message]; // logLine is my data source
  index = [[self logLine] count]-1;
  NSLog(@"%u", index);
  indexArray = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]];
  [[self logView] insertRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationRight];
}

插入有效,但新行大约需要5秒才会显示在UITableView !!

当我在tableView:cellForRowAtIndexPath:方法中放入一些日志时,会立即显示。

当我将FTPMessageReceived代码放在一个按钮(例如)中时,UITableView会立即显示新行!

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

听起来在后台线程上调用了FTPMessageReceived:。尝试使用以下命令在主线程上调用它:

dispatch_async(dispatch_get_main_queue(), ^{
    [[self delegate] FTPMessageReceived:@"dir created"];
});