1

Web サービスからデータをロードし、データをテーブル ビューに配置する iOS アプリケーションを作成しています。ユーザーは、セルをクリックして値を選択することにより、セル内のデータを更新できます。その値が選択された後、新しいデータを反映するようにテーブルを更新する必要があります。つまり、Web サービスからのデータの最初のダウンロードをやり直します。update メソッドの最後に、初期ロード メソッドを呼び出しますが、これは機能していないようです。元のデータがすべて再ロードされるだけです。これが私の更新方法の終わりです:

self.connectionInProgress = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];

[self loadLines];

そしてロードラインメソッド:

- (void)loadLines
{   
    NSLog(@"going again?");
    [Results removeAllObjects];
    [Results release];
    Results = nil;
    Results = [[NSMutableArray alloc] init];

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{

        NSString *jsonString = [self performFetchWithURL:lineURL];
        if(jsonString == nil) {
            [self showNetworkError];
            return;
        }

        NSDictionary *dictionary = [self parseJSON:jsonString];
        if(dictionary == nil) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [self showNetworkError];
            });
            return;
        }

        [self parseDictionary:dictionary];

        dispatch_async(dispatch_get_main_queue(), ^{
            isLoading = NO;
            [self.tableView reloadData];
        });
    });
}

parseDictionary と performFetchWithURL は、iOS 5 の非常に標準的な JSON インタラクションです...結果配列にデータを配置します。結果配列をクリアしてから再作成することで、正しいことをしていますか?

まったく新しいデータを取得するにはどうすればよいですか?

4

1 に答える 1

0

ASIHTTPRequest を調べることを強くお勧めします。問題の解決策になる場合とそうでない場合がありますが、多くの不要なコードが削除され、プロジェクトのデバッグが容易になります。GCD は優れていますが、スパムを送信すると、すぐに制御不能になり、発生しているような奇妙な動作を引き起こす可能性があります。

http://allseeing-i.com/ASIHTTPRequest/How-to-use

//Unsafe_unretained is for ARC which it doesn't look like you are using.
__unsafe_unretained ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:lineURL]];

// Code inside of this block will run when the request finishes
// This code will also be called to on the main thread. So you can avoid your own GCD
[request setCompletionBlock:^{
    if (![request responseString])
    {
        [self showNetworkError];
        return;
    }
    NSDictionary *dictionary = [self parseJSON:[request responseString]];
    if(dictionary == nil) {
        [self showNetworkError];
        return;
    }

    [self.tableView reloadData];
}];

//This code will run if your request fails
[request setFailedBlock:^{
     NSLog(@"Failed %@", [request error]);
}];

[request startAsynchronous];//Start the request

私はそれを試してみます。これで問題が解決しない場合は、投稿していないコードのどこかに問題がある可能性が非常に高くなります。

コンパイラが手元にないため、そのスニペットに構文エラーがあったことをお詫びします。

于 2012-08-10T02:30:37.333 に答える