2015-03-31 31 views
0

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

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

+0

不仅值得...我会说非常需要。 [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

回答

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

+0

虽然这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 – danh 2015-03-31 18:28:46

+0

我同意你丹..谢谢..更新我的答案与链接的细节。 – Iqbal 2015-03-31 18:38:10

0

使用异步API的

[NSURLConnection sendAsynchronousRequest:] 

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

一个异步调用是不会阻止你的主线程执行该Web请求调用。

相关问题