在实例中使用connectiondidFinishLoading并将数据返回到另一个视图

时间:2013-03-07 23:14:45

标签: objective-c xcode cocoa ios6 nsurlconnectiondelegate

我是可可的初学者,目标是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];
}

如果有人能提出一些建议,我会很高兴的。如果能够尽可能容易地理解我,那将是非常好的。提前致谢!

1 个答案:

答案 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;