同步与异步HTTP请求

时间:2014-07-03 02:52:37

标签: ios http asynchronous synchronous

我正在将基于JavaScript的混合应用转换为原生iOS应用。当我开始使用JavaScript开发应用程序时,我很失望地发现,如果您想要发出HTTP请求,则必须异步执行。我试图以各种方式解决这个问题,基本上是:

var done = false;
$.post(url, data, function() { done = true; });
while (!done) {}
//Continue

但我发现这是丑陋的,只是简单的不良做法,所以我克服了它并且只是异步地做了。

因此,当我开始使用iOS时,我很高兴能够同步执行此操作,但我再次感到失望的是发现推荐的做法是异步的,有利于闭包或委托来处理响应。

我的问题分为两部分:

  1. 为什么在几乎所有情况下都会异步进行异步而不是同步的HTTP请求?
  2. 有没有办法在iOS中制作同步请求并不难或有问题?
  3. 基本上,我一直希望能够做到这样的事情:

    var response = SubmitHTTPPostRequest(url, data)
    

    这不是真的吗?我在学校从未学过这种东西,所以如果这是一个基本的问题我会道歉。我一直都不明白为什么这就是它通常的做法。

2 个答案:

答案 0 :(得分:2)

您需要了解从发送请求到获取响应的过程。请求很可能会通过某个网络适配器,某个服务器,返回适配器然后再返回到CPU。一般情况下,没有涉及只涉及一个处理器的情况,在我描述的情况下是3但通常还有更多。这意味着同步因为在一个进程中完成所有工作是不可能的,因为涉及多个处理器。同步路径(如前所述)是您当前线程等待的。我不能同意将冻结你的UI,但会冻结你的线程(如果它是主线程,将冻结UI)。仍然将整个过程放入另一个等待响应的线程中会产生许多其他问题和问题,例如“我应该为每个请求创建一个线程”,“如果响应需要很长时间才能返回内存消耗吗?”......

我可以理解你想要这个同步,所以你可以在一个方法中进行操作,但最终这正是造成丑陋代码的原因。然后,您的方法包括创建请求,获取响应,处理响应以及处理收到的数据。这在开始时似乎是一个好主意,但是当这个方法变得太长时,你会想要将代码折射成至少3个方法,这些方法恰巧是你需要对异步请求做的事情。所以回答你的第二个问题:非常不可能,异步程序看起来不那么难看。

在大多数情况下,您应该做和完成的是创建一个处理您的请求和响应的类,因此从代码的UI部分您只需要执行一次调用。假设您有一个表视图,您将在其中显示从某个社交网络收到的朋友列表。当你第一次来到这个列表时,你想要一些活动指示器视图来通知用户数据正在加载,然后发送一些异步请求以让朋友不关心何时以及如果响应将返回但是当收到响应时你只需删除活动指示器并使用收到的新数据重新加载表视图。现在我希望您能想象这是一个非常优雅的代码,通过这样做,您可以让用户能够通过按下来取消请求。

因此,执行请求异步的主要原因是不阻塞线程,因为这可能会产生多个问题,甚至阻塞将阻塞UI的主线程,如果主线程被阻塞太久,应用程序将被终止iOS(看门狗)。和同步的原因?好吧,从长远来看,我无法想到,你应该总是将操作分解为多种方法并使用回调。

答案 1 :(得分:0)

首先,你应该非常清楚同步和异步术语。

当发送同步请求时,调用者必须等待请求完成该过程。 并且异步请求不等待完成。

根据堆栈溢出答案,我已阅读过一次:

当调用HttpHandler时,线程池线程用于运行该请求,并且相同的线程用于处理整个请求。如果该请求调用数据库或其他Web服务或任何其他可能需要时间的内容,则线程池线程将等待。这意味着当线程池线程可用于处理其他请求时,它们会花费时间等待事情。

相反,当一个HttpAsyncHandler时,存在一种机制,允许请求注册一个回调,并在完全处理请求之前将线程池线程返回到池。线程池线程开始对请求进行一些处理。此时,处理HTTP请求的线程池线程被返回到池以处理另一个HTTP请求。

您的答案:

1.因为异步请求不等待任务完成。发送请求,同时线程可以执行其他任务而无需等待。我在我的ios应用程序中使用ASIHttpRequest。

2.我们可以在实践中同步发送请求但不常见。