我正在将一个基于JavaScript的混合应用程序转换为一个本地iOS应用程序。当我开始用JavaScript开发这个应用程序时,我失望地发现,如果您想要发出HTTP请求,就必须异步执行。我试着用不同的方式来解决这个问题,基本上:
var done = false;
$.post(url, data, function() { done = true; });
while (!done) {}
//Continue但是我发现这是一种丑陋的、很糟糕的做法,所以我克服了它,只是异步地做了。
因此,当我开始使用iOS时,我很兴奋地想到我可能能够同步执行,但是我再次失望地发现,推荐的实践是异步的,倾向于闭包或委托来处理响应。
我的问题有两部分:
本质上,我一直想做这样的事情:
var response = SubmitHTTPPostRequest(url, data)这不是真的吗?我从来没有在学校学过这种东西,所以如果这是一个基本的问题,我很抱歉。我只是不明白为什么这是通常的做法。
发布于 2014-07-03 07:54:50
您需要了解从发送请求到获得响应的过程。请求很可能会通过某个网络适配器、某个服务器、回到适配器然后返回到您的CPU。一般来说,不存在只涉及一个处理器的情况,我描述的情况是3,但通常有更多的处理器。这意味着在一个过程中完成所有工作时的同步是不可能的,因为涉及到多个处理器。同步的路径(如前所述)是由当前线程等待的。我不能同意冻结你的UI,但是会冻结你的线程(如果它是主线程的话,它会冻结你的UI )。仍然将整个进程放入另一个等待响应的线程将产生许多其他问题和问题,例如“我是否应该为每个请求创建一个线程”,“如果响应需要太长时间才能返回,那么内存消耗吗?”
我可以理解您想要这种同步,所以您可以在一个方法中执行操作,但是最后,这正是造成丑陋代码的原因。然后,您的方法包括创建请求、获取响应、处理响应和处理所有接收的数据。从一开始,这似乎是个好主意,但是当这个方法变得太长时,您将希望将代码折射成至少3个方法,这正是您需要对异步请求所做的。因此,要回答第二个问题:非常不可能,异步过程看起来不那么丑陋。
在大多数情况下,您应该做的和所做的是创建一些类来处理您的请求和响应,因此,从代码的UI部分,您只需要执行一个调用。假设您有一个表视图,您将在该视图上显示从某个社交网络收到的朋友列表。当您第一次查看此列表时,您希望某个活动指示符视图通知用户正在加载的数据,然后发送一些异步请求,让朋友不关心响应何时以及是否会返回,但当收到响应时,您只需删除活动指示符并用收到的新数据重新加载表视图。现在,我希望您可以想象这是一段非常优雅的代码,通过这样做,您可以让用户通过按回键取消请求。
因此,执行请求异步的主要原因不是阻止线程,因为这可能会产生多个问题,甚至阻塞主线程,这会阻塞UI,如果主线程被阻塞太久,应用程序将在iOS (看门狗)中被杀死。那么同步的原因呢?好吧,从长远来看,我想不出有什么,你应该总是把操作分解成许多方法,并使用回调。
发布于 2014-07-03 07:07:05
首先,您应该非常清楚地了解同步和异步术语。
当同步请求发送时,调用方必须等待请求完成进程。异步请求不要等待完成。
作为堆栈溢出答案,我只读过一次:
调用HttpHandler时,使用线程池线程运行该请求,使用同一个线程处理整个请求。如果该请求调用数据库或其他web服务或任何其他可能需要时间的内容,则线程池线程将等待。这意味着线程池线程会花时间等待可以用来处理其他请求的事情。
相反,在HttpAsyncHandler时,存在允许请求注册回调并在请求完全处理之前将线程池线程返回到池的机制。线程池线程开始对指向的request.At执行一些处理,处理HTTP请求的线程池线程返回到池中以处理另一个HTTP请求。
您的答案:
1.因为异步请求不等待任务完成。发送请求,同时线程无需等待就可以执行其他任务。我在ios应用程序中使用ASIHttpRequest。
2.我们可以同步发送请求,但在实践中并不常见。
https://stackoverflow.com/questions/24544185
复制相似问题