1

私のアプリでは、ルートビューコントローラーがインターネットから情報を取得して解析し、に表示しますviewDidAppear。この方法を使用しているのは、アプリがに埋め込まれているためです。この方法ではUINavigationController、ユーザーが戻るボタンを押してルートビューにポップすると、ルートビューコントローラーがデータを再読み込みします。

この場合、インターネットからの情報を取得して表示するまでに時間がかかります。この間、ユーザーがボタンをクリックして別のビューに移動した場合、ビューコントローラーがWebデータの取得プロセスを完了するまで、ボタンアクションは発生しません。

ボタンが他のプロセスを上書きしてすぐにビューを切り替えるようにするにはどうすればよいですか?これは安全ですか?前もって感謝します。

編集

これは、サイトから情報を取得する部分の例です(私のアプリはHTMLを解析します)。

NSURL *siteURL = [NSURL URLWithString:@"http://www.ridgefield.org/ajax/dist/emergency-announcements"];
NSError *error;
NSString *source = [NSString stringWithContentsOfURL:siteURL 
                                            encoding:NSUTF8StringEncoding
                                               error:&error];
4

2 に答える 2

2

これは、Apple 関係者が「メイン スレッドをブロックしないでください!」と追い詰める場所です。

この種のワークフローの主な提案は、Web からデータをロードするために別のスレッド (読み取り: キュー) を使用することです。次に、ロードを完了したワーカーは、View Controller にいくつかのプロパティを設定できます。そのセッター内で、UI を更新する必要があります。メインスレッドでセッターをコールバックすることを忘れないでください。

並行処理の猫の皮をむく方法はいくつかありますが、この特定の質問に対する答えは範囲外です。簡単な答えは、メインスレッドでロードを行わないことです。そうすれば、適切な場所にたどり着くはずです。

于 2012-06-21T17:14:48.923 に答える
1

NSString メソッド stringWithContentsOfURL は同期的であり、メイン スレッドをブロックします。

バックグラウンド スレッドを使用して問題を解決する代わりに、非同期 URL 要求を使用できます。デリゲート プロトコルを使用して要求の完了を通知するため、これによってユーザー インターフェイスがブロックされることはありません。例えば:

        NSURL *url = [NSURL URLWithString:@""http://www.ridgefield.org/ajax/dist/emergency-announcements""];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        NSURLConnection* theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];       

そして、デリゲートメソッドのいくつかは次のとおりです。

-(void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)theResponse
{
    // create received data array
    _receivedData = [[NSMutableData alloc] init]; 
}

-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)theData
{
    // append to received data.
    [_receivedData appendData:theData];
}


-(void)connectionDidFinishLoading:(NSURLConnection*)connection
{
    // now the connection is complete
    NSString* strResult = [[NSString alloc] initWithData: _receivedData encoding:NSUTF8StringEncoding];

    // now parse strResult
}
于 2012-06-21T17:24:34.890 に答える