我正在编写一个iOS应用程序,其中多个iDevices可以相互连接并相互发送消息。当iDevice1向iDevice2发送消息时,我希望将该消息插入iDevice2中的队列中。 iDevice2上的一个单独的后台线程现在通过此队列并使消息出列。我的问题有两个,如下:
我一直在使用dispatch_async grand central dispatch方法在不同的线程中执行任务,并且它一直运行良好。我应该使用dispatch_async方法来启动轮询队列的后台线程吗?这种方法是否会处理切换到其他线程,或者后台线程是否会占用处理器,因为它正在进行无限循环?感谢任何帮助,谢谢!
答案 0 :(得分:1)
这里更重要/有趣的问题是为什么你有一个后台线程(轮询或其他)进入GCD队列而不是简单地使整个事情成为基于GCD的工作流,其中一个队列上运行的块(可能与一个队列相关联)调度源或信号量)将工作提交到工作队列中。换句话说,管理iDevice1和iDevice2的代码都应该使用GCD编写,并表达工作流的意图与进行任何手动线程管理。代码将更容易理解,更易于维护!
答案 1 :(得分:0)
你不想轮询,这是不好的做法,它没有充分的理由使用CPU。你想要做的是使用NSMutableArray设置一个共享的fifo,并用NSConditionLock保护它的访问。消费者任务(您可以使用NSOperation创建)将锁定NSConditionLock,直到生产者任务发出信号表明fifo中有一些数据可用。
答案 2 :(得分: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
});
});
}