我刚遇到这种奇怪的情况。
我正在使用苹果示例中的延迟图像加载技术。
当我在我的应用程序中使用该类时,它给了我学习的主题,但没有实际发生的那些。
所以这就是场景:
我想每个人都看过苹果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
}
所以我想知道这背后的概念是什么。
如果您无法理解问题或详情不够,请告诉我,因为我非常想知道为什么会这样?
答案 0 :(得分:3)
此方法只是调用您选择的方法,但它在主线程上执行。主要线程是负责更新UI和处理应用程序主运行循环等。甚至NSApplication
对象也处理主线程上的事件。
因此,您可以使用此方法通过将要执行的方法作为参数传递给Objective-C选择器,该对象用于表示方法的输入,如果您的方法不需要参数,则为nil,以及最后一个布尔值,指示在执行方法之前是否要阻塞,或者如果您想立即返回而不等待方法执行。
如果您的方法需要多个参数,则将所有必需参数包装到例如NSDictionary
中,并将字典对象作为第二个参数传递。
在您的情况下,为了重新加载表,您需要更新主线程中的UI。