我建议不要尝试在不同的线程上重新调用您的方法,而是使用dispatch_sync()
并dispatch_get_main_queue()
确保只有敏感代码位于主线程上。这可以很容易地包装在一个函数中,就像Brad Larson 对“GCD to perform task in main thread”的回答一样。
他的过程与您已经拥有的过程基本相同,不同之处在于代码被放入一个块中并根据需要调用或入队:
if ([NSThread isMainThread])
{
blockContainingUICode();
}
else
{
dispatch_sync(dispatch_get_main_queue(), blockContainingUICode);
}
如果您愿意,也可以轻松地将其转换为宏。
创建块本身不需要太多改变。如果您的 UI 代码如下所示:
[[self textLabel] setText:name];
[[self detailTextLabel] setText:formattedDollarValue];
[[self imageView] setImage:thumbnail];
将其放入要排队的块中,如下所示:
dispatch_block_t blockContainingUICode = ^{
[[self textLabel] setText:mainText];
[[self detailTextLabel] setText:detailText];
[[self imageView] setImage:thumbnail];
};