【问题标题】:Create two threads in Objective-C在 Objective-C 中创建两个线程
【发布时间】:2012-11-13 16:51:00
【问题描述】:

我对 Xcode 和 Objective-C 很陌生,所以我还不知道自己在做什么! ;-)
基本上我想要一个可以运行两个线程的 iPhone 应用程序,稍后将使用UDP Sockets 与其他应用程序通信。

当按下 UI 中的 start-Thread/stop-Thread 按钮时,我已经设置了函数来做出反应,现在我想用代码填充它们以实际创建和启动线程。

  • 这里的正确程序是什么?

  • 我需要继承NSThread吗?

  • 我在哪里实现新线程将执行的代码?

    我看不到运行方法或类似的东西。我想这与我不明白的 selector 有关。

【问题讨论】:

标签: objective-c xcode multithreading network-programming


【解决方案1】:

使用dispatch queues。它们本质上是轻量级线程,您无需直接担心线程或队列。

-(void) spawn
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        [self doWorkInBackground];
    });
}

您可以使用内置队列之一或您自己的。

您也应该阅读blocks,尤其是内存管理方面。

【讨论】:

  • 您好,感谢您的回答,我开始阅读指南。但是,据我现在了解,我们可以有串行或并发队列。在串行任务中,任何时候只执行一个任务,这对我来说是不够的,因为可能同时有两个任务。所以我需要一个并发队列,但是系统管理多少任务并行运行。但是,当用户需要它们时,我需要准确地运行这两个任务。但是一般来说,我需要创建 2 个块或函数,每个块或函数都执行一个“线程”并将它们放入队列中?
  • 由于块是与其余代码内联编写的,并且我需要为每个线程设置一个块并且线程不会太短,我想知道这是否真的是正确的方法,考虑代码概述。
  • 你可以声明不符合规则的块就好了
【解决方案2】:
- (void)performBlockInBackground:(void (^)())block {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        block();
    });
}

那你这样称呼它:

[self performBlockInBackground:^{
    NSLog(@"Log from background");
}];

【讨论】:

  • 如果不检查块是否为空,该方法会崩溃。
  • @danielbeard 当然可以,但你到底为什么要打电话给[self performBlockInBackground:NULL];
  • 如果块存储在不同的对象上并被释放,则该块将为 NULL。例如。 someObject.actionBlock
  • @danielbeard 是的,当然,你可以这样做。但这确实是个例外。
  • 不,这是最佳实践。任何时候你调用一个块,你都应该检查它不是 NULL。
【解决方案3】:

这是一个非常深入的讨论,但 Apple 的“Concurrency Programming Guide”应该可以帮助您入门。

【讨论】:

    【解决方案4】:

    您也可以考虑使用NSOperation。它在后台使用调度队列,但提供更高级别的 API 和取消正在进行的操作的可能性(这可能对您有帮助)。

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多