gpt4 book ai didi

objective-c - NSURLConnection 获取 JSON 文件

转载 作者:太空狗 更新时间:2023-10-30 03:57:49 25 4
gpt4 key购买 nike

我的 iOS 应用正在获取内部代码(例如 101),并通过该代码读取服务器上的 JSON 文件(例如 101.json)并读取内部数据。一切都运行良好,但是如果服务器上没有文件(用于该代码)(现在它只是在找不到文件时不显示任何数据)并且没有互联网连接只是为了从应用程序内的 JSON 文件获取数据,该怎么办?这是我的代码:

NSString *baseURLStr = @"http://myserverurl/";
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL
URLWithString:[baseURLStr stringByAppendingFormat:@"%d/%d.json", int1, int2]]];
NSData *data = [NSURLConnection sendSynchronousRequest:request
returningResponse:nil error:nil];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

我发现了如何在没有互联网连接的情况下读取应用程序中的文件。

if (data == nil){

NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"FAILED" ofType:@"json"]];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
self.members = json[@"data"];

}
else {

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
self.members = json[@"data"];

}

最佳答案

您可能需要检查三种类型的问题:

  • 连接错误:检查以确保连接没有失败;如果失败,数据将为 nil 并且 NSError 对象将被填充;典型原因是 URL 中的服务器名称无效、服务器已关闭或根本没有互联网连接);

  • HTTP 错误:如果执行 HTTP 请求,您想检查网络服务器是否报告成功检索页面/资源,即您收到 HTTP 状态代码 200;错误条件的示例可能是 404 - 未找到错误(请参阅 HTTP Status Code Definitions 以获得更完整的列表);和

  • 服务器代码错误:检查以确保服务器以有效的 JSON 响应,即检查收到的响应是否可以成功解析为 JSON(您要确保有生成 JSON 的服务器代码没有问题,例如服务器代码中的错误)。

因此:

NSURLRequest *request = nil;
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:&error];
if (!data) {
NSLog(@"%s: sendSynchronousRequest error: %@", __FUNCTION__, error);
return;
} else if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
if (statusCode != 200) {
NSLog(@"%s: sendSynchronousRequest status code != 200: response = %@", __FUNCTION__, response);
return;
}
}

NSError *parseError = nil;
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
if (!dictionary) {
NSLog(@"%s: JSONObjectWithData error: %@; data = %@", __FUNCTION__, parseError, [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
return;
}

// now you can use your `dictionary` object

显然,如果它是 NSArray,请将上面的 JSONObjectWithData 行更改为返回数组,但概念是相同的。

或者,更好的是,使用异步连接(因为你不应该在主队列上使用同步连接):

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (!data) {
NSLog(@"%s: sendAynchronousRequest error: %@", __FUNCTION__, connectionError);
return;
} else if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
if (statusCode != 200) {
NSLog(@"%s: sendAsynchronousRequest status code != 200: response = %@", __FUNCTION__, response);
return;
}
}

NSError *parseError = nil;
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
if (!dictionary) {
NSLog(@"%s: JSONObjectWithData error: %@; data = %@", __FUNCTION__, parseError, [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
return
}

// now you can use your `dictionary` object
}];

// Note, with asynchronous connection, do not try to use `data`
// or the object you parsed from theJSON after the block, here.
// Use it above, inside the block.

关于objective-c - NSURLConnection 获取 JSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20995815/

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