所以,我正在尝试连接到远程服务器以获取和显示数据。在viewDidLoad
中,我使用NSThread
来调用名为doSomething
- (void)doSomething
{
@autoreleasepool
{
NSMutableURLRequest *httpRequest = [NSMutableURLRequest requestWithURL:someURL];
[httpRequest setHTTPMethod:@"POST"];
[httpRequest setValue:[NSString stringWithFormat:@"%d", httpRequestParametersClean.length] forHTTPHeaderField:@"Content-Length"];
[httpRequest setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[httpRequest setHTTPBody:httpRequestParametersClean];
(void)[[NSURLConnection alloc] initWithRequest:httpRequest delegate:self];
for (NSString* key in response)
{
// loop through returned values
}
}
}
viewDidLoad
中的代码是
[NSThread detachNewThreadSelector:@selector(someURL) toTarget:self withObject:nil];
然后我有一个REFRESH
按钮,点击它时也会调用doSomething
只需说出[self doSomething]
我的问题是,当加载视图时,来自服务器的响应变为空。在点击刷新按钮之前,我仍然没有回复。奇怪!我做错了什么?
答案 0 :(得分:3)
使用NSURLConnection
创建的initWithRequest:delegate:
工作异步,调用委托函数connection:didReceiveResponse:
,connection:didReceiveData:
,...稍后,当数据为从服务器读取。您的代码甚至没有start
连接,因此无论如何都不会发生任何事情。
解决问题的最简单方法是使用同步版本
sendSynchronousRequest:returningResponse:error:
NSURLConnection
的。如果doSomething
在单独的线程中执行,则不会阻止UI。
已添加:(感谢@geowar提及此内容。)请注意,您还可以使用基于委托的NSURLConnection
方法。这些更灵活(例如,参见https://stackoverflow.com/a/15591636/1187415进行比较)。另一个不错的选择是sendAsynchronousRequest:queue:completionHandler:
,它会自动创建一个后台线程。