是否值得在新线程中运行HTTP请求?

时间:2015-03-31 17:50:56

标签: objective-c multithreading http

我在Objective c中创建了一个应用程序,它通过HTTP请求从服务器接收和发送数据。它工作正常,但当我连接到学校的互联网时,应用程序冻结。我认为wifi太慢了,我想创建一个新线程并抛出一个HTTP请求并保持线程活着,直到应用程序完成连接,因此它不会与主界面冲突。

问题是我对线程并不熟悉,我想知道这样做是否值得。

2 个答案:

答案 0 :(得分:0)

Facebook提供了一个用于处理HTTP请求的异步,非阻塞API。我们希望能够等待HTTP请求返回结果。具体来说,我们正在向Facebook发起一个事件,我们想知道刚刚发布的事件的FacebookEventID。

为了做到这一点,我们创建了一个变量“postRequestReturned”并将其设置为false。在post函数中,只要“postRequestRetured”为false,我们就发送请求然后阻塞线程。这里需要注意的是,一个简单的while循环导致阻塞主线程并使应用程序无法接收来自Facebook的响应。相反,我们在目标c中使用了Runloop库, Runloop是您的线程进入的循环,用于运行事件处理程序以响应传入的事件。一些好的文件

Wait for code to finish execution

https://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

我们使用的代码段

while(!postRequestReturned){

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

}

在Facebook请求的完成处理程序中,我们将postRequestReturned变量设置为true。

提供者: Wait for HTTP request to finish in obejective-c for iOS

答案 1 :(得分:0)

使用异步API

执行Web请求调用
[NSURLConnection sendAsynchronousRequest:]

[[NSURLConnection alloc] initWithRequest:m_webRequest delegate:self startImmediately:YES] 

异步调用不会阻止你的主线程。