我在Objective c中创建了一个应用程序,它通过HTTP请求从服务器接收和发送数据。它工作正常,但当我连接到学校的互联网时,应用程序冻结。我认为wifi太慢了,我想创建一个新线程并抛出一个HTTP请求并保持线程活着,直到应用程序完成连接,因此它不会与主界面冲突。
问题是我对线程并不熟悉,我想知道这样做是否值得。
答案 0 :(得分:0)
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。
提供者: 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]
异步调用不会阻止你的主线程。