2

私が使うとき

[NSTimer scheduledTimerWithTimeInterval:intervalCountDownTimer target:self selector:@selector(updateCountDownDurationForTimer:) userInfo:nil repeats:YES];

スクロールすると一時停止しUITableViewます。スクロールが停止した後にのみ再開されます。

私のtableViewはdispatch_async & dispatch_sync画像を非同期にロードするために使用していますが、これが主な原因であるかどうかはわかりません。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            FXDMediaItem *mediaItem = [self mediaItemAtIndexPath:indexPath];

            if (mediaItem) {
                dispatch_sync(dispatch_get_main_queue(), ^{
                    cell.imageviewAlbumArt.image = [mediaItem albumArtImage];
                });
            }
        });

このタイマーをバックグラウンド モードで実行する方法を探していましたが、適切な解決策が見つかりませんでした。である必要はありませんが、スケジュールされた繰り返しプロセスNSTimerを使用する必要があります。

答えは実際には簡単なものかもしれないと思いますが、見つけることができません

4

3 に答える 3

6

ここでの問題は、scheduledTimerWithTimeInterval:target:selector: userInfo:repeats: でタイマーを作成すると、デフォルト モードでメインの実行ループに追加されることです。これは、UITableView (実際には UIScrollView) をスクロールすると一時停止するようです。ここでの秘訣は、次のように、タイマーを別のモードでメインの実行ループに追加することです。

timer = [NSTimer timerWithTimeInterval:intervalCountDownTimer target:self selector:@selector(updateCountDownDurationForTimer:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
于 2012-07-02T08:27:19.827 に答える
0

すでにバックグラウンド作業に GCD を使用している場合は、内部の内容updateCountDownDurationForTimer:をバックグラウンド スレッドに入れてみてください。

于 2012-07-02T08:08:35.983 に答える
0

タイマーについては、dispatch_source_create()を見ましたか?

レーベルか何かを更新していると思いますよね?-scrollViewDidScroll:テーブル ビューがスクロールしている間にラベルを更新し、スクロールしていない間はタイマーを保持します。

私の仮定が間違っている場合は、タイマーで行っていることのコードを投稿してください。それに応じて回答を更新します。

于 2012-07-02T08:22:09.630 に答える