iOS-ViewDidDisplay:显示UITableView时延迟

iOS-ViewDidDisplay:显示UITableView时延迟,ios,uitableview,viewdidappear,Ios,Uitableview,Viewdidappear,我有个奇怪的问题。我有一个选项卡栏应用程序,其中我为每个不同的选项卡使用一个导航控制器,每个导航控制器都有自己的视图控制器来显示一些内容 当我触摸某个选项卡时,我希望该选项卡立即与视图一起加载,加载后(viewdide:),我希望它在viewdide:方法中下载一些数据 为了测试此功能,我设置了以下方法。我正在使用NSThread模拟执行一些长时间的操作,这些操作应该在加载视图时在后台完成。然后我用一些测试数据分配NSArray*测试(非原子,retain)并重新加载表 我正在重新加载表,因为在

我有个奇怪的问题。我有一个选项卡栏应用程序,其中我为每个不同的选项卡使用一个导航控制器,每个导航控制器都有自己的视图控制器来显示一些内容

当我触摸某个选项卡时,我希望该选项卡立即与视图一起加载,加载后(
viewdide:
),我希望它在viewdide:方法中下载一些数据

为了测试此功能,我设置了以下方法。我正在使用
NSThread
模拟执行一些长时间的操作,这些操作应该在加载视图时在后台完成。然后我用一些测试数据分配NSArray*测试(非原子,retain)并重新加载表

我正在重新加载表,因为在
viewDidLoad
方法中,我将表设置为仅包含一个空字符串(这是因为我了解到表是在调用viewdide:之前设置的)

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];

    DLog(@"viewDidAppear running");

    [NSThread sleepForTimeInterval:10];

    NSArray *array = [[NSArray alloc] initWithObjects:@"Test1", @"Test2", @"Test3", @"Test4", @"Test5", @"Test6", nil];
    self.test = array;

    [array release];

    [table reloadData];
}

因此,我的预期行为应该是,当触摸此特定选项卡时,它应该立即加载,然后在10秒后,它应该使用ViewDidDisplay:方法中的表格数据填充。但是相反,当触摸此选项卡时,它等待10秒,然后显示ys填充了表数据的视图。

您不是将错误的线程置于睡眠状态吗?(即将创建数组的线程)

似乎您等待了10秒钟,然后调用表reloadData


为什么还要等待?难道不想在数据可用时立即填充tableView吗?

调用
[NSThread sleepForTimeInterval:10];
将阻止主线程执行任何更新,因此您无法看到任何用户界面更改。如果要如上所述延迟重新加载表数据,请选中
NSObject performSelector:withObject:afterDelay:

    -(void)executeMe{


        NSArray *array = [[NSArray alloc] initWithObjects:@"Test1", @"Test2", @"Test3", @"Test4", @"Test5", @"Test6", nil];
        self.test = array;

        [array release];



        [table reloadData];



    }







    - (void)viewDidAppear:(BOOL)animated {

        [super viewDidAppear:animated];

        DLog(@"viewDidAppear running");



        [self performSelector:@selector(executeMe) withObject:nil afterDelay:10];


    }

将用于重新加载数据和数组设置的代码放入一个方法中,然后通过执行选择器:withObject:afterDelay:

调用它。其他答案解释了在使用
+[NSThread sleepForTimeInterval:
方法时主线程被阻塞的原因

要处理网上下载,您应该将下载任务推送到后台线程,以避免像这里这样阻塞主线程。您可以使用Grand Central Dispatch实现这一点

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
    /* Download stuff */

   dispatch_async(dispatch_get_main_queue(), ^{
       /* Send UI updates back to the main thread. */
       [self.tableView reloadData];
   });
});

我只是使用NSThread来模拟一个冗长的操作。我可以从internet下载数据,而不是使用NSThread。我想这就是我要找的,但是你可能知道为什么我的表在ViewDidDisplay之前没有显示:?我的表正在等待ViewDidDisplay:方法运行,然后显示表。如果ViewDidDisplay中的“块”代码执行用户界面将无法绘制和刷新自身,因为ui正在刷新(大多数情况下)由该主线程完成。因此,在该方法运行后,系统将运行代码以实际绘制用户界面和表。这是否有帮助?如果我删除NSThread调用,viewDidAppear仍将延迟。据我所知,在loadView运行后应立即显示视图,然后执行viewDidAppe中的任何内容ar.但这里的情况是,视图不会立即显示,而是等待ViewDidDisplay方法运行,然后显示视图。在
loadView
之后和
ViewDidDisplay
之前,代码中会发生什么情况?例如,您是在进行长时间运行的设置还是使用特殊动画?通常情况下,“ViewDidDisplay”应该发生r在视图被激活(并在之前加载/创建)后快速退出。在调用
viewdideappear
之前,一定有什么原因导致时间间隔。谢谢,您是否有机会回答@marcus中我的问题?