2

我正在编写一个 iOS 应用程序,其中多个 iDevice 可以相互连接并相互发送消息。当 iDevice1 向 iDevice2 发送消息时,我希望将该消息插入 iDevice2 的队列中。iDevice2 上的一个单独的后台线程现在通过此队列并将消息出列。我的问题有两个,如下:

  1. 实现无限循环(直到应用程序终止)并从队列中轮询和出列项目的后台线程的最佳方法是什么?
  2. 在循环后台线程和将消息插入队列的线程之间共享队列的最佳方法是什么?

我一直在使用 dispatch_async 大型中央调度方法在不同的线程中执行任务,并且运行良好。我应该使用 dispatch_async 方法来启动轮询队列的后台线程吗?这种方法是否负责切换到其他线程,或者后台线程是否会占用处理器,因为它正在执行无限循环?任何帮助表示赞赏,谢谢!

4

3 回答 3

1

这里更重要/更有趣的问题是为什么你有一个后台线程(轮询或其他方式)馈送到 GCD 队列,而不是简单地将整个事情变成一个基于 GCD 的工作流,其中块在一个队列上运行(可能与调度源相关联或信号量)将工作提交到工作队列中。换句话说,管理 iDevice1 和 iDevice2 的代码都应该使用 GCD 编写并表达工作流的意图,而不是进行任何手动线程管理。代码会更容易理解和维护!

于 2012-09-24T03:04:03.443 回答
0

你不想轮询,这是不好的做法,它没有充分的理由使用 CPU。您要做的是使用即 NSMutableArray 设置共享 fifo 并使用 NSConditionLock 保护其访问。消费者任务(您可以使用 NSOperation 创建)将锁定 NSConditionLock,直到生产者任务发出信号表明 fifo 中有一些可用数据。

于 2012-09-23T16:22:04.660 回答
0

无需轮询队列——队列中的项目将根据队列的语义执行。你可以这样做:

-(dispatch_queue_t)messageQueue {
    static dispatch_queue_t queue;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        queue = dispatch_queue_create("my message queue", DISPATCH_QUEUE_SERIAL);
    });
    return queue;
}

-(void)didRecieveMessage:(NSString *)message {
    dispatch_async([self messageQueue], ^{
        // do something with message
        dispatch_async(dispatch_get_main_queue(), ^{
            // update the UI
        });

    });
}
于 2012-09-24T17:54:41.087 回答