1

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

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

为了测试这个功能,我设置了以下方法。我正在使用 aNSThread来模拟在加载视图时应该在后台完成的一些冗长操作。然后我为 NSArray *test (nonatomic, retain) 分配一些测试数据并重新加载表。

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

- (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 秒后它应该填充来自 viewDidAppear: 方法的表数据。行为是,当触摸此选项卡时,它会等待 10 秒,然后显示填充了表数据的视图。

4

4 回答 4

1

调用[NSThread sleepForTimeInterval:10];将阻止主线程进行任何更新,因此您看不到任何用户界面更改。如果您想延迟重新加载表数据,请检查NSObject performSelector:withObject:afterDelay: NSObject 类参考

将 reloadData 和数组设置的代码放在一个方法中,然后通过它调用它performSelector:withObject:afterDelay:

于 2011-07-13T11:09:50.607 回答
1

其他答案解释了为什么在使用+[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];
   });
});
于 2011-07-13T11:38:42.903 回答
0
    -(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];


    }
于 2011-07-13T11:00:59.967 回答
0

你不是让错误的线程进入睡眠状态吗?(即将创建数组的那个)

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

你为什么还要等?您不想在数据可用后立即填充 tableView 吗?

于 2011-07-13T10:58:54.083 回答