我是可可的初学者,目标是c - 所以请原谅我一个可能微不足道的问题。
我目前正在开发一个XCODE-Project,它通过NSJSONSerialization获取一些数据并存储它以供进一步的工作。
在这一步中,我将封装将数据提取到一个类中的进度,该类具有一些所需参数的设置器(要从中获取的url和应该被解析为数组的层)。为了使用这个过程,我在这个类中创建了一个创建连接和请求的方法,并返回应该包含数据的数组。经过一些测试后,我尝试创建这个类的一个实例并调用开始获取数据的方法。
我的问题是,从我的新实例“block_stats”调用方法data_array之后 并将数据存储在相同类型的数组中 - 数组为空
table_data = [block_stats data_array];
这种行为的原因是(didReceiveResponse,didReceiveData,connectionDidFinishLoading)中的方法的使用是异步的,并且在下载完成之前完成了data_array的返回。
包含下载部分的类中的方法:
- (NSMutableArray *)data_array
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
if(data_array)
{
[data_array removeAllObjects];
} else {
data_array = [[NSMutableArray alloc] init];
}
NSURLRequest *request = [NSURLRequest requestWithURL:data_url];
connection = [NSURLConnection connectionWithRequest:request delegate:self];
if(connection)
{
webdata = [[NSMutableData alloc]init];
}
return data_array;
}
另一个视图中的IBAction创建实例并调用方法来获取数据
- (IBAction)refresh:(UIBarButtonItem *)sender {
KDJSONparser *block_stats = [[KDJSONparser alloc]init];
[block_stats setURL:[NSURL URLWithString:@"*JSONDATA_URL*"]];
[block_stats setLayer:@"blocks"];
table_data = [block_stats data_array];
}
如果有人能提出一些建议,我会很高兴的。如果能够尽可能容易地理解我,那将是非常好的。提前致谢!
答案 0 :(得分:2)
你的问题的解决方案在于授权(正如这个词暗示你将指定其他人在情况出现时采取行动。)
您已在以下代码段中使用过此功能。
NSURLRequest *request = [NSURLRequest requestWithURL:data_url];
connection = [NSURLConnection connectionWithRequest:request delegate:self];
这里当你将self设置为NSURLConnection的委托时,你告诉编译器发送任何与连接相关的适当消息。这些消息包括didReceiveResponse,didReceiveData,connectionDidFinishLoading。
所以让我们在你的课堂上实现这些方法,看起来就像这样。
KDJSONParser.m
- (NSMutableArray *)fetchData
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSURLRequest *request = [NSURLRequest requestWithURL:data_url];
connection = [NSURLConnection connectionWithRequest:request delegate:self];
if(connection)
{
webdata = [[NSMutableData alloc]init];
}
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
// This method is called when the server has determined that it
// has enough information to create the NSURLResponse.
// It can be called multiple times, for example in the case of a
// redirect, so each time we reset the data.
// receivedData is an instance variable declared elsewhere.
[webdata setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Append the new data to receivedData.
// receivedData is an instance variable declared elsewhere.
[webdata appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
[connection release];
//Parse the webdata here. Your array must be filled now.
[self parseTheJSONData];
}
-(void)parseTheJSONData
{
//Do your parsing here and fill it into data_array
[self.delegate parsedArray:data_array];
}
在您的其他课程中,在刷新方法
中添加此行block_stats.delegate = self;
并实施
-(void)parsedArray:(NSMutableArray *)data_array;