Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 同步相关非同步化函数目标C_Objective C_Multithreading_Asynchronous_Objective C Blocks - Fatal编程技术网

Objective c 同步相关非同步化函数目标C

Objective c 同步相关非同步化函数目标C,objective-c,multithreading,asynchronous,objective-c-blocks,Objective C,Multithreading,Asynchronous,Objective C Blocks,因此,我遇到了竞争情况,我有一些解决方案来解决这个问题。很明显,我对线程还不熟悉,我的观点和研究都很有限。我有大量的异步调用,如果用户从服务器接收到某些消息,就会发生这些调用。因此,由于对象的依赖性,我的设计很差 假设我有一个函数,名为 adduser:(NSString s){ does some asynchronize activity } Messageuser:(NSString s) { Does some more asychronize activity } 如果用户收到一条

因此,我遇到了竞争情况,我有一些解决方案来解决这个问题。很明显,我对线程还不熟悉,我的观点和研究都很有限。我有大量的异步调用,如果用户从服务器接收到某些消息,就会发生这些调用。因此,由于对象的依赖性,我的设计很差

假设我有一个函数,名为

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。如果没有,请继续。否则等待,而不是在完成后继续

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

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

如果异步操作使用完成块,那么您可以让完成块发出下一个要执行的操作的请求,尽管您可能事先不知道这一点

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

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

//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的消息与之通信,然后通过调度到将成为UI线程的dispatch_get_main_queue()来更新UI