【问题标题】:Calling performSelectorOnMainThread => Multithreaded app?调用 performSelectorOnMainThread => 多线程应用程序?
【发布时间】:2010-09-18 06:44:43
【问题描述】:

我注意到来自我的主线程的以下平庸调用

[self performSelectorOnMainThread:@selector(rollBar:)
      withObject:nil
      waitUntilDone:false];

导致[NSThread isMultiThreaded] 报告我的应用程序
变成了多线程。我以为那只是应该的
当你分离一个线程时发生,排队的东西
一个线程中的消息应该不需要这样做。

有什么见解吗?

这个问题和this不一样。

停止新闻
我的错,rollBar:[m_progress_bar incrementBy: 0.5];
漂亮,可舔,动画NSProgressIndicator负责
使我的应用程序成为多线程的。这令人惊讶。
我不知道。

令人惊讶的是,[m_progress_bar usesThreadedAnimation] 总是
返回NO,即使我的应用程序挂起时栏会显示动画。

【问题讨论】:

  • 但是如果你试图运行一些东西(在主线程中)并且不愿意等到这个操作完成(“waitUntilDone: false”),这并不意味着你必须在至少两个线程?
  • 不,您只是将事件发布到您自己线程的队列中。至少这是你所期望的。不过等一下,我想通了:我做了一些愚蠢的事情,但结果令人惊讶。

标签: objective-c cocoa multithreading


【解决方案1】:

你确定吗?我将以下代码放在我的 appDelegate 的 init 方法中:

NSLog(@"Multi-threaded before? %@", [NSThread isMultiThreaded] ? @"Yes" : @"No");
[self performSelectorOnMainThread: @selector(setDelegate:) withObject: self waitUntilDone: NO];
NSLog(@"Multi-threaded after? %@", [NSThread isMultiThreaded] ? @"Yes" : @"No");

并在控制台中得到这个结果:

2008-10-21 07:26:28.296 MyApplication[82963:20b] Multi-threaded before? No
2008-10-21 07:26:28.297 MyApplication[82963:20b] Multi-threaded after? No

我还在我的 applicationWillTerminate: 方法中添加了第二个 NSLog(...) 语句,它还告诉我它不是多线程的。

【讨论】:

  • 谢谢,你让我走上了正轨。 rollBar 中的 NSProgressIndicator:使我的应用程序变为多线程。谁知道!?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2016-09-01
  • 2020-11-24
相关资源
最近更新 更多