0

プログラムの実行をどのように停止しますか? スリープ機能はそれをしませんか?もしそうなら、このコードの何が問題なのですか:

AsyncImageView *tmpImage = [imagesArray objectAtIndex:index];

int waitCounter = 0;
while (waitCounter < 10 && !tmpImage.imageIsLoaded) {
    waitCounter++;
    sleep(0.5);
}
NSLog(@"%i",waitCounter);
if (tmpImage.imageIsLoaded) {
    return [tmpImage image];
} else {
    return [UIImage imageNamed:@"img_noimg.png"];
}

AsyncImageView クラスは、URL から画像を読み込み、imageIsLoaded プロパティを true に設定します。これは通常、非常に高速 (1 秒未満) に発生しますが、狂ったように画像をスクロールすると、読み込む時間がありません (10 画像先に読み込まれます)。

これが起こらないように while を追加しましたが、ログには、スリープ時間がない (インターフェイスがフリーズしていない) 間に、waitCounter が 10 になる複数のケースが表示されます。

4

3 に答える 3

1

このような問題を解決する 1 つの方法は、完了ハンドラを使用することです。完了ハンドラーは、非同期タスクが完了したときに呼び出しサイトに通知し、タスクの結果をパラメーターとして完了ハンドラーに渡します。

あなたのAsyncImageViewクラスには確かにそのような完了ハンドラがあります。セレクターです。今日では、代わりにブロックを使用します。原理は同じですが。

非同期タスクが終了した後に続行することを「継続」と呼びます。ブロックを使用すると、コードは次のようになります。

typedef void (^completion_handler_block)(id result);

void doSomethingAsync(completion_handler_block)completionHandler;

- (void) foo {

    doSomethingAsync(^(id result) {
        // Continuation code
        ...
    });

}

継続を実装するブロックを使用すると、コンテキスト (呼び出しサイトで定義された参照変数) をブロック (クロージャー) 内に保持できるため、継続は特に簡単です。

于 2013-08-30T09:26:52.103 に答える
-1

これを試してみてください。うまくいくと思います。それ以外の

sleep(0.5);

試す

[NSThread sleepForTimeInterval:.5f];
于 2013-08-30T09:01:39.637 に答える