サーバーからデータをロードするために NSURLConnection 非同期呼び出しを使用しています。メインスレッドで適切なデータが得られますが、UI がフリーズします。1) performSelectorInBackground を使用して非同期呼び出しを行う方法 データを非同期的にロードすることによって何が間違っているのか。
どんな助けでも大歓迎です
サーバーからデータをロードするために NSURLConnection 非同期呼び出しを使用しています。メインスレッドで適切なデータが得られますが、UI がフリーズします。1) performSelectorInBackground を使用して非同期呼び出しを行う方法 データを非同期的にロードすることによって何が間違っているのか。
どんな助けでも大歓迎です
NSURLConnection 経由ではありませんが、ブロックされない方法は次のとおりです。
NSURL *xmlURL = [NSURL URLWithString:URL];
if (self.xmlParser != nil)
{
[self.xmlParser abortParsing];
self.xmlParser = nil;
}
dispatch_queue_t loadQueue1 = dispatch_queue_create("loadQueue1", NULL);
// Use another thread to avoid blocking main thread
dispatch_async(loadQueue1,^{
self.xmlParser = [[[NSXMLParser alloc] initWithContentsOfURL:xmlURL] autorelease];
// -------------------------------------------------------------------
[self.xmlParser setDelegate:self];
dispatch_async(dispatch_get_main_queue(),^{
if (self.xmlParser != nil)
{
[self.xmlParser parse];
}
});
});
dispatch_release(loadQueue1);
OK、コードをデバッグした後、エラーが発生しました。非同期呼び出しではありませんが、巨大な応答を受け取った後の更新メソッドが UI をフリーズさせます。また、データを印刷するために配置した NSLog も問題を引き起こします。
非同期 API で使用する場合は、使用NSURLConnection
する必要はありませんperformSelectorInBackground
。メインスレッドから呼び出し、デリゲートを設定すると、メインスレッドをブロックすることなく、データが来るか別のイベントが発生したときにデリゲートが呼び出されます。