NSThread无法加载Selector方法

时间:2013-03-31 17:56:16

标签: objective-c cocoa nsthread

所以,我正在尝试连接到远程服务器以获取和显示数据。在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]

即可

我的问题是,当加载视图时,来自服务器的响应变为空。在点击刷新按钮之前,我仍然没有回复。奇怪!我做错了什么?

1 个答案:

答案 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:,它会自动创建一个后台线程。