2

私はココアのObjective-cの初心者ですので、些細な質問をお許しください。

私は現在、NSJSONSerializationを介していくつかのデータをフェッチし、さらなる作業のために保存するXCODEプロジェクトに取り組んでいます。

このステップでは、データのフェッチの進行状況を、必要なパラメーター(フェッチ元の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];

ここで、自分自身を 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 に答える