包括Apple的文档(sendSynchronousRequest:returningResponse:error)在内的所有地方都表示不使用同步网络。我想知道如何在没有同步调用的情况下解决以下要求:
答案 0 :(得分:2)
如果您使用同步通话阻止用户界面,则用户可能会认为您的应用已锁定并将其保留。此外,如果在您设置应用程序时有一个同步调用阻止主线程,操作系统可能会杀死该应用程序,同时也相信它已被锁定。一般情况下,UI不应该在它不需要时被冻结,并且网络调用永远不应该,它们应该始终在后台线程上执行。因此,如果您使用同步方法,则应在后台线程上完成。
在您进行网络通话期间,您应该在应用中显示某种进度/忙碌指示符。如果在此过程中禁用与UI的交互,则可以正常运行,但用户应该能够看到存在某种UI活动,因此他们知道您的应用程序未被冻结。
答案 1 :(得分:1)
某些操作确实需要同步,这很好。但是在可能的情况下,通常最好在主线程之外执行阻塞操作。
答案 2 :(得分:1)
考虑2种请求类型:
这在主线程上执行网络操作。有时可能没关系,但记住现在需要超过一秒的任何东西都太长了。这对用户来说只是一种糟糕的体验。
这将在后台执行网络任务。这不会冻结你的申请。这意味着更好的用户体验。因为在执行网络操作时。你有机会用“请等待消息”来更新界面。
此登录+抓取头像动作,它们不应该同步吗?当用户需要做的事情需要他们登录时,让用户继续使用ui的重点是什么。
asynchrounously
,因为这是一种更好的用户体验。UIIndicatorView
或progressView
。 用户很快就会失去耐心,他们可能认为你的应用只是顽固/滞后
答案 3 :(得分:1)
是的,登录和提取不应该相互发生。但它们应该与主线程异步发生。所以通常你会异步启动登录,并在完成块中(或者,如果使用基于委托的网络请求,在完成委托方法中)确认登录成功,然后启动任何进一步的网络请求,例如检索头像,再次确保它们以异步方式运行。
您应该考虑同步网络请求的唯一时间是在后台队列中启动它们时,因此当它们与后台线程同步时,它们的行为与主线程异步。但是同步网络请求技术本质上是限制性的(例如,没有取消方法,无法处理认证挑战等),因此许多人将使用更强大的基于异步委托的网络请求机制完全放弃同步网络请求技术。