gpt4 book ai didi

iphone - 从 NSThread 的函数调用时不调用 NSURLConnection 委托(delegate)

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:50:04 25 4
gpt4 key购买 nike

我发送了 NSURLConnection 请求,它工作正常。现在我想刷新信息,即从按钮的 IBAction 调用时重新发送 NSURLConnection.Refresh 正在工作。但不适用于 NSThread 方法。我该如何解决这个问题。这里的NSThread函数用于运行系统时间。当时间等于凌晨 1:00 时,我想刷新 API。但它不调用 NSURLConnection 的委托(delegate)。

这是 NSURLConnection 代码:

-(void)displays:(model *)place
{
NSString *strs=[@"http://www.earthtools.org/timezone-1.1/" stringByAppendingString:[NSString stringWithFormat:@"%@/%@",place.latitude,place.longitude]];

NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:strs]];

NSURLConnection *reqTimeZone=[NSURLConnection connectionWithRequest:request delegate:self];
[reqTimeZone start]; //here request not get start
}

以上代码在名为“displays”的函数中,参数是类的一个实例,它具有所有位置详细信息。

NSthread函数代码:

- (void) setTimer {    
//assign current time
[self countDown];
}

- (void) countDown {
//count the current time

if(hrs==12&& meridian==@"pm")

[self display:(placedetails)];//it calls the displays function but NSURLConnection is not get start.

[NSThread detachNewThreadSelector:@selector(setTimer) toTarget:self withObject:nil];
}

上面的显示函数调用了 placedetails assigned 但 NSURLConnection delegate 没有被调用。

最佳答案

要调用委托(delegate)方法,您需要将线程的运行循环附加到 NSURLConnection。由于您正在创建一个线程并且没有将 NSURLConnection 附加到线程的 RunLoop,因此不会触发连接委托(delegate)方法。

这是一个例子:

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.


// I am creating a button and adding it to viewController's view
UIButton *bttn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[bttn setFrame:CGRectMake(100.0f, 200.0f, 120.0f, 50.0f)];
[bttn setTitle:@"Download" forState:UIControlStateNormal];
[bttn addTarget:self action:@selector(spawnThreadForDownload) forControlEvents:UIControlEventTouchUpInside];

[[self view] addSubview:bttn];
}

- (void)spawnThreadForDownload
{
[NSThread detachNewThreadSelector:@selector(downloadAndParse) toTarget:self withObject:nil];
}

- (void)downloadAndParse
{
@autoreleasepool {
NSURL *url = [NSURL URLWithString:@"http://apple.com"];
NSURLRequest *req = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval:20.0f];
NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self];

// Run the currentRunLoop of your thread (Every thread comes with its own RunLoop)
[[NSRunLoop currentRunLoop] run];

// Schedule your connection to run on threads runLoop.
[conn scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
}

// NSURLConnectionDelegate methods

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"Connection failed with error: %@",[error localizedDescription]);
}

// NSURLConnectionDataDelegate methods

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"Connection finished downloading");
}

关于iphone - 从 NSThread 的函数调用时不调用 NSURLConnection 委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10537038/

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