概念性问题:performSelectorOnMainThread做什么?

时间:2010-04-15 12:46:56

标签: iphone multithreading

我刚遇到这种奇怪的情况。

我正在使用苹果示例中的延迟图像加载技术。

当我在我的应用程序中使用该类时,它给了我学习的主题,但没有实际发生的那些。

所以这就是场景:

我想每个人都看过苹果lazytableimagesloading。

我在完成解析数据时重新加载了我的表:

 - (void)didFinishParsing:(NSMutableArray *)appList
    {


     self.upcomingArray = [NSMutableArray arrayWithArray:loadedApps];

   // we are finished with the queue and our ParseOperation
 [self.upcomingTableView reloadData];


        self.queue = nil;   // we are finished with the queue and our ParseOperation

    }

但结果是连接未启动且图像未加载。当我完全复制lazyimageloading并用以下代码替换上面的代码时,它可以正常工作

- (void)didFinishParsing:(NSMutableArray *)appList
{


 [self performSelectorOnMainThread:@selector(handleLoadedApps:) withObject:appList waitUntilDone:NO];


    self.queue = nil;   // we are finished with the queue and our ParseOperation

}

所以我想知道这背后的概念是什么。

如果您无法理解问题或详情不够,请告诉我,因为我非常想知道为什么会这样?

LazyTableImages

1 个答案:

答案 0 :(得分:3)

此方法只是调用您选择的方法,但它在主线程上执行。主要线程是负责更新UI和处理应用程序主运行循环等。甚至NSApplication对象也处理主线程上的事件。

因此,您可以使用此方法通过将要执行的方法作为参数传递给Objective-C选择器,该对象用于表示方法的输入,如果您的方法不需要参数,则为nil,以及最后一个布尔值,指示在执行方法之前是否要阻塞,或者如果您想立即返回而不等待方法执行。

如果您的方法需要多个参数,则将所有必需参数包装到例如NSDictionary中,并将字典对象作为第二个参数传递。

在您的情况下,为了重新加载表,您需要更新主线程中的UI。