1

I'm loading a rather simple XML file from a URL. I wanted to show the network activity indicator while the parser is loading the file, but obviously not while it is parsing.

Question: Does the initWithContentsOfUrl: method lock program execution while the document is loaded from the url? In other words, is the code below correct?

It seems obvious to me that this is okay, but I wanted to make 100% sure.

NSString* const urlString = @"...";
NSURL* url = [NSURL URLWithString:urlString];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
NSXMLParser* parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];   
4

3 に答える 3

4

この記事はそれをかなりよく説明していますhttp://akosma.com/2010/05/28/initwithcontentsofurl-methods-considered-harmful/

もちろん、これらのメソッドの主な問題は、それらが同期しているという事実です。これは、それらを実行しているスレッド(通常はUIスレッド)が戻るまで完全にブロックすることを意味します。ほとんどのアプリケーションでは、これは、アプリケーション全体を未知の時間ブロックしていることを意味します。つまり、ボタンやUIウィジェットは入力に反応せず、ナビゲーションは不可能であり、タッチイベントは配信または実行されず、ネットワーク操作が完了するまで何も起こりません。

さらに悪いことに; initWithContentsOfURL:を使用する場合、タイムアウトはなく、ネットワーク障害に対する意味のあるフィードバックはなく、ユーザーが現在のネットワーク操作をキャンセルする方法もありません。この最後の要因は、それ自体でinitWithContentsOfURLを使用しないことを正当化します。悪いユーザーエクスペリエンスにつながるコードを決して出荷してはなりません。ユーザーはこれに憤慨し、文句を言うでしょう!

于 2012-06-09T14:00:21.067 に答える
1

ダウンロードの進行状況を表示する場合は、などを使用して自分でファイルをダウンロードしてNSURLConnectionから、ローカルファイルパスをXMLパーサーに渡す必要があります。

于 2012-06-09T13:24:28.797 に答える
1

はい、ブロックします。そのため、アクティビティインドケーターは表示されません。

于 2012-06-09T13:53:54.837 に答える