2012-03-06 2 views
2

UIScrollView内にUIImageViewがあります。 UIImageViewは、インターネット(NSURLConnectionを使用して開かれたストリーム)から絶えずダウンロードされる画像を表示します。UIScrollView内でUIImageViewを更新する - スクロールで画像がフリーズする

NSString surl = @"some valid url"; 
NSURL* nsurl = [NSURL URLWithString:surl]; 
NSURLRequest *request = [NSURLRequest requestWithURL:nsurl]; 
[[NSURLConnection alloc] initWithRequest:request delegate:self]; 

// this method will be called when every chunk of data is received 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    // here I collect data and when i have enough 
    // data to create UIImage i create one 
} 

私がデータを受信するたびに、私はNSDataの中にそれをパックし、私は全体の画像を受信したとき、私は、このたNSDataからUIImageを作成してから、私はUIImageViewの画像としてこの画像を設定します。すべてが正常に動作しますが、画面をタッチしてコンテンツを移動し始めると(このUIImageViewは常に画面より大きく、UIScrollViewは常に画面全体に表示されます)、イメージの更新は停止し、最後に表示されたフレームのみが表示されます私はクリックした。これは、私の

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 

が呼び出されて停止しているためです。画面から指を離した後、再びデータと画像の更新を受信します。なぜ私のNSURLConnectionデリゲートメソッドがデータの受信を停止するのか分かりません。どんな助け?

答えて

4

-[NSURLConnection initWithRequest:didReceiveData:]のドキュメントは、この意見:デフォルトで

、接続が正しく動作するために、呼び出し元のスレッドの実行ループは、デフォルトの実行ループモードで動作している必要があります。

メインスレッドでNSURLConnectionを作成しているとします。

UIScrollViewがタッチを追跡しているとき、デフォルトモードではなく異なるモードで実行ループを実行します。そのため、スクロール表示に触れている間に更新を停止するのはこのためです。 (これはまた、スクロールビューに触れている間発射を停止するNSTimer秒になります。)

は、私はあなたがデフォルトのモードと、このようなスクロールビューのトラッキングモードの両方で動作するようにあなたのNSURLConnectionを設定することができると思う:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request 
    delegate:self startImmediately:NO]; 
[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode: NSRunLoopCommonModes]; 
[connection start]; 
0

ユーザーインタラクションのようなサウンドは、両方ともメインスレッドで実行されているため、データの更新をブロックしています。私はちょっと前にカップルにvery similar questionに反応したことがあります。

関連する問題