gpt4 book ai didi

objective-c - NSThread 无法加载 Selector 方法

转载 作者:行者123 更新时间:2023-12-03 17:34:49 25 4
gpt4 key购买 nike

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

我的问题是,当加载 View 时,服务器的响应为空。在单击刷新按钮之前我仍然没有得到任何响应。奇怪的!我做错了什么?

最佳答案

使用 initWithRequest:delegate: 创建的 NSURLConnection 异步工作,调用委托(delegate)函数 connection:didReceiveResponse: , connection:didReceiveData:, ...稍后,当从服务器读取数据时。您的代码甚至不会启动连接,因此无论如何都不会发生任何事情。

解决问题的最简单方法是使用同步版本

sendSynchronousRequest:returningResponse:error:

NSURLConnection。如果 doSomething 在单独的线程中执行,则不会阻塞 UI。

已添加:(感谢 @geowar 提及这一点。)请注意,您还可以使用基于委托(delegate)的 NSURLConnection 方法。这些更加灵活(参见例如 https://stackoverflow.com/a/15591636/1187415 进行比较)。另一个不错的选择是 sendAsynchronousRequest:queue:completionHandler:,它会自动创建后台线程。

关于objective-c - NSThread 无法加载 Selector 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15732596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com