【问题标题】:Synchronizing dependent asychnronized functions Objective C同步依赖的异步函数Objective C
【发布时间】:2014-02-10 16:46:19
【问题描述】:

所以我遇到了竞争状况,我有一些解决问题的方法。很明显,我对线程很陌生,我的意见和研究是有限的。如果用户从服务器接收到某些消息,我会发生大量的异步调用。因此,由于我的对象的依赖性质,我的设计很差。

假设我有一个名为

的函数
adduser:(NSString s){
does some asynchronize activity
}
Messageuser:(NSString s)
{
 Does some more asychronize activity
}

如果用户收到一条消息,告诉它添加用户“Ryan”。他会创建一个线程并继续查找 Ryan 并存储他。但是,如果用户的应用程序处于挂起模式,并且在等待接收的消息缓冲中存在 addUser 请求和 MessageUser 请求,则会出现竞争条件,因为完成 Adduser 所需的时间比完成 MessageUser 所需的时间长。因此,如果 messageUser 被调用,并且(在我们的示例中)“Ryan”尚未完全添加,则会引发错误。

此问题的可能解决方案是什么。我查看了锁和信号量,我想做的是,当 MessageUser 收到一个调用时,检查以确保当前没有线程正在处理 addUser。如果没有,请继续。否则等待,而不是在完成后继续。

【问题讨论】:

    标签: objective-c multithreading asynchronous objective-c-blocks


    【解决方案1】:

    这首先取决于消息是如何发出的,以及异步响应事件是什么。

    如果操作有依赖关系(排序要求),那么后台串行队列是否合适?这是确保消息按顺序处理的简单方法。

    如果异步操作需要完成块,那么您可以让完成块发出要执行的下一个操作的请求,尽管您可能不提前知道。

    如果您需要以更通用的方式解决此问题,那么您需要某种系统来跟踪先决条件,以便您可以跳过尚未满足先决条件的工作项。这可能意味着您自己的后台线程监控等待任务列表并接收所有任务完成的通知,以便它可以扫描等待完成的项目并发出它们。

    虽然看起来真的很复杂...我怀疑您并没有如此强大的异步并行处理要求,并且更简单的设计同样有效。鉴于您从服务器接收消息的情况,我认为串行队列将是最佳选择。然后,您可以按照服务器发送消息的顺序处理消息并保持简单。

    //do this once at app startup
    dispatch_queue_t queue = dispatch_queue_create("com.example.myapp", NULL);
    
    //handle server responses
    dispatch_async(queue, ^{
        //handle server message here, one at a time
    });
    

    实际上,根据您连接到服务器的方式,您可能只需将整个连接处理移动到后台队列并通过来自 UI 的消息与其通信,并通过调度到 dispatch_get_main_queue() 来更新 UI这将是 UI 线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      相关资源
      最近更新 更多