什么是 ios 中的同步和异步?我是目标 c 的新手。当我从服务器获取数据时,我应该在我的代码中使用哪一个。所以请帮助我。
提前致谢。
您应该始终使用网络请求的异步加载。
Asynchronous
永远不要阻塞等待网络响应的主线程。
异步可以在单独的线程上同步,也可以在任何线程的运行循环中调度。
Synchronous
阻塞主线程,直到他们完成请求。
对于演示代码或教程,请查看此链接 Asynchronous web service client using NSURLConnection and SBJSON
使用异步所有线程并行执行操作。所以,永远不要阻塞等待网络响应的主线程。
使用同步所有线程一个一个地执行操作。所以,应该等到其他线程任务完成。
希望会合适。
大多数情况下,您会为此类操作进行异步调用,否则您的 UI 将阻塞,因为您正在使用主线程。
同步,顾名思义,动作将与应用程序的运行循环同步发生。
为了更好地理解它,假设您必须在从服务器获取数据后在 UITableview 中显示一些数据。想象一下来自服务器的请求和响应大约需要 3 秒。当您从服务器同步获取此数据时,您的应用程序将在加载 tableview 和将数据内容加载到该 tableview 之间冻结 3 秒
现在,如果您异步发送请求,您的应用程序不会冻结,但会在服务器响应之前加载 tableview 和 tableview 内容。换句话说,您的应用不会等待 3 秒的服务器响应时间。您必须采取必要的委托操作或阻止操作来检查响应并重新加载表数据,以便服务器响应显示在表视图中。
哪种方法更好是纯粹选择开发人员想要什么以及他们的应用程序应该表现的,但 Apple 文档建议如果您使用同步调用,请不要从当前运行循环启动调用。
基于其他答案的快速说明:除非您分派到主线程,否则 dispatch_sync 不会阻塞主线程。
例子:
// Block main thread because the main queue is on it.
dispatch_sync(dispatch_get_main_queue(), ^{ /*do stuff*/ });
// Block background thread.
dispatch_sync(my_work_queue, ^{ /*do stuff*/ });
同步调用(阻塞)是必须在后续调用可以在同一队列中运行之前完成的调用。它被赋予该队列的所有处理器时间,直到它完成。这使它阻塞了队列。 异步调用可以在队列中启动,然后在该队列拥有的另一个线程(处理器时间计划)上运行,而其他调用则由其他线程启动。
将 dispatch_async 用于 Web 调用非常重要,因为可能需要一些时间才能返回结果,并且您希望其他任务能够在队列中启动并使用它的线程。一种常见的做法是在自定义后台队列上进行 Web 工作,例如下载文件,然后在完成后分派到主队列,以更新用户。
还有更多内容,您可以在此处阅读 Apple 的调度队列。