2014-02-11 85 views
1

无处不在,包括苹果的文档(sendSynchronousRequest:returningResponse:error)说不使用同步网络。我想知道如何在没有同步呼叫的情况下解决以下要求:ios和同步请求

  1. 该应用并不需要登录才能进行大多数操作。某些操作要求用户应该登录。
  2. 当用户选择要求他们登录的操作时,他们将被选择登录。他们点击登录按钮,登录操作对用户进行身份验证,然后发出请求以获取他们的头像图像。这个登录+抓取头像动作,不应该是同步的吗?当用户需要做的事情需要他们登录时,让用户继续使用用户界面的要点是什么。

回答

1

如果您通过同步呼叫阻止用户界面,用户可能会认为您的应用已被锁定并保留。另外,如果在您背景应用程序时阻止主线程的同步调用,操作系统可能会终止该应用程序,并认为它已被锁定。一般来说,UI不应该在不需要时冻结,而且网络调用不应该,它们应该始终在后台线程上执行。所以如果你使用同步方法,他们应该在后台线程上完成。

在您进行网络通话的过程中,您应该在应用中显示某种进度/忙碌指示符。如果在此过程中禁用与用户界面的交互,这很好,但用户应该能够看到存在某种UI活动,因此他们知道您的应用没有被冻结。

+0

我想我误解了每个人意味着同步调用。它们表示主线程上的同步调用。我全部用于在后台线程上进行调用并显示模态加载指示器。 – septerr

1

有些操作需要同步,这很好。但是,如果可能,通常最好在主线程之外执行阻塞操作。

1

想一想2种请求类型:

  • 同步

此主线程上执行网络操作。它有时可能会好起来,但记住现在需要一秒以上的时间太长。所以这对用户来说只是一个糟糕的体验。

  • asynchrounously

这在后台执行网络任务。这不会冻结你的应用程序。这意味着更好的用户体验。因为在执行网络操作时。您有机会使用“请稍候消息”更新界面。


此登录+取化身动作,她们不能同步?什么让用户的点与UI继续当他们需要做什么,需要他们能够被记录下来。

  • 现在回答你的问题,你应该使用进行网络请求asynchrounously只是因为它是一个更好的用户体验。
  • 你不会让用户继续到另一个屏幕,你只是在做请求时自由地做其他事情。这允许您例如使用UIIndicatorViewprogressView

用户松动的耐心快,他们可能会认为你的应用程序仅仅是slugish /滞后

+0

谢谢。我误解了一直给予的建议。我认为人们所说的是让用户始终与UI元素交互。我完全同意在后台线程上进行调用并在主线程上显示加载指示器。谢谢! – septerr

1

是,登录和取不应同时相对于彼此发生。但是它们应该相对于主线程异步发生。因此,通常您会异步启动登录,并在完成块中(或者,如果使用基于委托的网络请求,则在完成委托方法中)确认登录成功,然后发起任何进一步的网络请求,例如检索头像,再次确保他们异步运行。

您应该考虑同步网络请求的唯一时间是当您在后台队列中启动它们时,因此当它们相对于后台线程同步运行时,它们相对于主线程异步运行。但是同步网络请求技术固有地受到限制(例如,没有取消方法,不能处理认证挑战等),因此许多人将使用更健壮的基于异步委托的更为健壮的网络请求机制来完全放弃同步网络请求技术。

+0

谢谢,我现在开始明白这一点。 – septerr