iOS - 确保在主线程上执行[重复]

Posted

技术标签:

【中文标题】iOS - 确保在主线程上执行[重复]【英文标题】:iOS - Ensure execution on main thread [duplicate] 【发布时间】:2012-07-19 21:35:45 【问题描述】:

我想知道如何在主线程上调用我的function

如何确保我的function主线程上被调用?

(这是我之前的question)。

【问题讨论】:

我认为只有使用[NSObject performSelectorOnMainThread] 调用您的委托方法的类才能被视为安全。否则,如果对象只是调用[NSObject performSelector],您的委托方法将在调用者线程的上下文中运行。 【参考方案1】:

这样就可以了:

[[NSOperationQueue mainQueue] addOperationWithBlock:^ 

   //Your code goes in here
   NSLog(@"Main Thread Code");

];

希望这会有所帮助!

【讨论】:

确实如此,谢谢。您是否知道这是否受到与 meccans 的回答(我猜是 GCD 版本)相同的限制,例如“不要从主线程调用它”? 嗯,我只是觉得这种方式更容易,因为如果你这样做,你就不必每次想在主线程上做某事时都创建一个新方法。 在将我的 XCode 升级到最新的 ios 6.1 模拟器时,这帮助我解决了套接字编程的神秘问题。代码在从套接字读取一些数据后立即写入套接字。出于某种奇怪的原因,这在 iOS 5.1 模拟器中就像一个魅力,但在 6.0 或 6.1 中却没有——使用这个建议在主线程中的套接字上执行写操作解决了我的问题,它适用于所有模拟器版本和设备! 所以我在上面的答案中使用了代码块:(dispatch_sync(dispatch_get_main_queue(), ^ //你的代码在这里 NSLog(@"Main Thread Code"); );)然而,由于 gcd 运行良好,我遇到了一个问题,即主线程不会获得优先权,并且应用程序会在我拥有的 iPod5 中停止运行。我改用 NSOperationQueue 并且效果很好。奇怪的奇怪案例,但我想,我会在这里记录下来。 那么这个,不像dispatch_get_main_queue,可以直接在主线程上做吗?【参考方案2】:

当您使用 iOS >= 4

dispatch_async(dispatch_get_main_queue(), ^
  //Your main thread code goes in here
  NSLog(@"Im on the main thread");       
);

【讨论】:

只是为了让 OP 很清楚,如果你已经在主线程上,这不是你想做的事情。 究竟会发生什么可怕的事情? (只是为了好奇) 主线程冻结!这里是来源:***.com/a/7817170/644629 另见***.com/questions/5662360/…(你应该可以使用dispatch_async并且在主线程上没有问题)。 @ChrisPrince thx 提示,编辑答案【参考方案3】:

我可以遵循什么规则来确保我的应用只在主线程中执行我自己的代码?

通常您不需要做任何事情来确保这一点——您的事情清单通常就足够了。除非您正在与一些碰巧产生线程并在后台运行代码的 API 进行交互,否则您将在主线程上运行。

如果你想确定,你可以这样做

[self performSelectorOnMainThread:@selector(myMethod:) withObject:anObj waitUntilDone:YES];

在主线程上执行一个方法。 (也有一个 GCD 等价物。)

【讨论】:

你会如何处理你生成线程在后台运行代码的情况?【参考方案4】:

我认为这很酷,即使一般来说它的好形式是让方法的调用者负责确保在正确的线程上调用它。

if (![[NSThread currentThread] isMainThread]) 
    [self performSelector:_cmd onThread:[NSThread mainThread] withObject:someObject waitUntilDone:NO];
    return;

【讨论】:

以上是关于iOS - 确保在主线程上执行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何防止主线程ios杀死后台线程

具有私有并发类型的 NSManagedObjectContext 在主线程上执行块

ios 将一个函数在主线程执行的4种方法

GCD主队列是不是必须在主线程上执行?

ios requestaccessformediatype需要在主线程执行吗

iOS 子线程下载 主线程刷新UI