0

iOS アプリの UI を更新する方法に問題があります。私が達成したかったのはこれです:

  1. Web サービスから取得したデータに基づいて UITableView にデータを表示する
  2. Web サービスは別のスレッド (メイン スレッドではない) から呼び出す必要があります。
  3. データが取得された後、取得されたデータで UITableView の内容が更新されます
  4. これは、ネットワーク接続が悪い状態で Web サービスからデータを受信して​​いるときに、UI がハングしたり、アプリがユーザー入力をブロックしたりしないようにするためです。

そのために、次のソース コードを作成します。

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSURL *myURL = [[NSURL alloc] initWithString:[Constant webserviceURL]];
    NSURLRequest *request = [NSURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData                        timeoutInterval:60];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    [self myparser] = [[MyXMLParser alloc] initXMLParser];

    [parser setDelegate:myparser];
    BOOL success = [parser parse];
    if (success) {
        // show XML data to UITableView
        [_tableView performSelectorOnMainThread:@selector(reloadData) withObject:[myparser xmldata] waitUntilDone:NO];
    }
    else {
        NSLog(@"Error parsing XML from web service");
    }
}

================== 私の実装は正しいですか? 誰もそれを解決する方法を知っていますか?

4

1 に答える 1

0

あなたは電話したいでしょう

+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler

別のスレッドでデータを取得するための呼び出しを行い、データがプルダウンされた場合、または URL からデータをダウンロードする際に問題が発生した場合、元の呼び出しが行われたのと同じスレッドでハンドラー ブロックを呼び出します。

これを使用する1つの方法は次のとおりです。https://stackoverflow.com/a/9409737/1540822

使用することもできます

- (id)initWithRequest:(NSURLRequest *)request delegate:(id < NSURLConnectionDelegate >)delegate

これにより、データがチャックにダウンロードされるときに NSURLConnectionDelegate メソッドの 1 つが呼び出されます。大きなデータが必要な場合は、これを使用して、応答にあまり時間を費やさないようにすることができます。

于 2012-07-23T06:47:15.853 に答える