gpt4 book ai didi

ios - NSURLConnection sendAsynchronousRequest 没有得到响应

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:06 26 4
gpt4 key购买 nike

我有一个创建 NSURLRequest 的方法,并使用 NSURLConnection 方法 sendAsynchronousRequest:queue:compltionHandler: 发送该请求。这在我获取 json 文件或图像数据时工作正常,但是当我尝试获取 XML 文档时,发生了一些非常奇怪的事情。正在调用该方法,但从来没有响应,因此永远不会调用完成处理程序。有谁知道如何解决这一问题?我已经使用这种方法数百次,但我从未见过这种行为。这是我调用 sendAsynchronousRequest:queue:compltionHandler:

的方法
- (void)getCachedFile:(NSString *)title withCompletion:(void (^)(NSData *data))completion
{
Reachability *reach = [Reachability reachabilityForInternetConnection];
NetworkStatus status = [reach currentReachabilityStatus];
if (status == NotReachable)
{
// read data locally
NSError *error = nil;
NSData *data = [NSData dataWithContentsOfFile:[self filePath:title]
options:NSDataReadingUncached
error:&error];
if (error)
{
NSLog(@"COULD NOT READ LOCAL CACHED DATA: %@", error.localizedDescription);
}
else
{
completion(data);
}
}
else
{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:title]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:30.0f];

// get data from NSURLCache
NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
if (cachedResponse)
{
// if the data is found in the response, use it
completion([cachedResponse data]);
}
else
{
// get the data from the server
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue currentQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError)
{
NSLog(@"ERROR CONNECTING DATA FROM SERVER: %@", connectionError.localizedDescription);
}
else
{
[self.writingOperationQueue addOperationWithBlock:^{
[[NSFileManager defaultManager] createFileAtPath:[self filePath:title]
contents:data
attributes:nil];
}];
completion(data);
}
}];
}
}
}

最佳答案

一些注意事项:您的网络请求的完成 block 正在捕获 self。这将导致保留周期。

^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError)
{
NSLog(@"ERROR CONNECTING DATA FROM SERVER: %@", connectionError.localizedDescription);
} else {
[self.writingOperationQueue addOperationWithBlock:^{
[[NSFileManager defaultManager] createFileAtPath:[self filePath:title]
contents:data
attributes:nil];
}];
completion(data);
}
}

要修复它,您应该在 block 之前声明一个变量 __weak MyClass *weakSelf = self; 并且只在 block 内使用它。

您的具体问题可能与您正在调用的文档类型无关,更多的是与您从哪个线程调用它无关。您正在对 [NSOperationQueue currentQueue] 执行网络操作。如果这是一个系统队列,它很可能在您的请求完成之前被释放。您应该声明一个 NSOperationQueue 属性并在其上执行所有网络请求。

[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue currentQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {...}];

应改为:

[NSURLConnection sendAsynchronousRequest:request
queue:self.networkOpQueue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {...}];

关于ios - NSURLConnection sendAsynchronousRequest 没有得到响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21418292/

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