【发布时间】:2014-10-29 18:11:18
【问题描述】:
关于我在互联网上看到的每一个教程和示例,都展示了如何从某个 url 获取 JSON 并将其显示在 Tableview 中。这不是我的问题,我知道如何使用 AFNetworking 框架或原生 API 来做到这一点。
我的问题是,在我下载了 JSON 之后,我想在我的 UIView 标签中显示其中的一些。当我试图找到解决 NSURLSession 无法在 iOS 8 中缓存的方法时,我实际上已经成功地做到了这一点。但我没有意识到它是同步的。
工厂.m
+ (Factory *)responseJson
{
static Factory *shared = nil;
shared = [[Factory alloc] init];
NSHTTPURLResponse *response = nil;
NSString *jsonUrlString = [NSString stringWithFormat:@"http://urltojson.com/file.json"];
NSURL *url = [NSURL URLWithString:[jsonUrlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSError *error = nil;
NSURLRequest *request = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestReturnCacheDataElseLoad
timeoutInterval:10.0];
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (error) {
NSLog(@"error");
} else {
//-- JSON Parsing
NSDictionary *result = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:nil];
//NSLog(@"Result = %@",result);
shared.responseJson = result;
}
return shared;
}
我的问题是否可以使用例如 AFNetwoking 来做同样的事情?我是否缺少一些需要调用的方法,例如 TableView 的情况
[self.tableView reloadData];
我想使用那个框架,因为我需要检查可达性,而且它似乎已经实现了。
按要求编辑以显示更多代码
ViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
[self factoryLoad];
[self setupView];
}
- (void)factoryLoad
{
Factory *shared = [Factory responseJson];
self.titles = [shared.responseJson valueForKeyPath:@"data.title"];
dispatch_async(dispatch_get_main_queue(), ^{
[self.collectionView reloadData];
});
}
- (void)setupView
{
self.issueTitleLabel.text = [self.titles objectAtIndex:0];
}
【问题讨论】:
-
那么,您尝试将数据放入标签的哪个位置?
-
在 viewDidLoad 中。使用异步获取方法,我尝试将获取方法放在 viewWillAppear 中并在 viewDidLoad 中设置所有标签,但这没有用。
-
您可以编辑您的问题并显示用于设置标签文本的代码吗?如果您正在异步获取数据并在完成处理程序之外设置标签文本,您可能会尝试将文本设置为实际不存在的值,因为尚未获取数据。
-
好吧,在你收到数据之前你不能使用它。
-
嗯,我明白了。我想我只是将网络代码保留在 ViewController 中。
标签: objective-c json ios7 uiview afnetworking-2