2

我是 Cocoa 和 Objective-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];
}

如果有人可以提供一些建议,我将非常高兴。如果它对我来说尽可能容易理解,那就太好了。提前致谢!

4

1 回答 1

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;
于 2013-03-08T07:25:15.827 回答