我在Objective c中做了一个应用程序,通过HTTP请求从服务器接收和发送数据。它工作正常,但当我连接到学校的互联网应用程序冻结。我认为wifi太慢了,我想创建一个新线程并抛出一个HTTP请求,并保持线程一直活动,直到应用程序连接完成,因此它不会与主接口发生冲突。是否值得在新线程中运行HTTP请求?
问题是我不太熟悉线程,我想知道是否值得这样做。
我在Objective c中做了一个应用程序,通过HTTP请求从服务器接收和发送数据。它工作正常,但当我连接到学校的互联网应用程序冻结。我认为wifi太慢了,我想创建一个新线程并抛出一个HTTP请求,并保持线程一直活动,直到应用程序连接完成,因此它不会与主接口发生冲突。是否值得在新线程中运行HTTP请求?
问题是我不太熟悉线程,我想知道是否值得这样做。
Facebook提供了一个用于处理HTTP请求的异步非阻塞API。我们希望能够等待HTTP请求返回结果。具体而言,我们正在向Facebook发起活动,并且我们想知道我们刚发布的活动的FacebookEventID。
为了做到这一点,我们创建了一个变量“postRequestReturned”并将其设置为false。在post函数中,只要“postRequestRetured”为false,我们就发送请求并阻塞线程。这里需要注意的一点是,一个简单的while循环导致阻塞主线程并使应用程序无法接收来自Facebook的响应。相反,我们在目标c中使用了Runloop库, Runloop是您的线程输入并用于运行事件处理程序以响应传入事件的循环。一些好的单证
Wait for code to finish execution
我们使用
while(!postRequestReturned){
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
在为Facebook请求完成处理程序的代码片段中,我们的postRequestReturned变量设置为true。
使用异步API的
[NSURLConnection sendAsynchronousRequest:]
或
[[NSURLConnection alloc] initWithRequest:m_webRequest delegate:self startImmediately:YES]
一个异步调用是不会阻止你的主线程执行该Web请求调用。
不仅值得...我会说非常需要。 [Check out this](https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/index.html#//apple_ref/occ/clm/NSURLConnection/sendAsynchronousRequest: queue:completionHandler :)它可以让GCD为你工作。 – danh 2015-03-31 18:25:42