8

私はgithubからこのプロジェクトを使用しています。これは画像ピッカーです。ios7 以降、アルバムのプレビュー画像を再度表示するために非常に小さな変更を加える必要がありましたが、その変更により、ピッカーを離れて戻ってくると、選択した写真 (2/5) が 0/5 にリセットされます。私は写真を選択していますが。どうすればこれを修正できますか?

内部のUIをリロードしてdispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)も、UIを更新するのに永遠にかかるようです。dispatch_async(dispatch_get_main_queue()コメントアウトするとdispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)、写真はすぐに読み込まれますが、キューに依存する他のものが壊れます。

これは、 I changed with the code i changed がコメント化されたコード スニペットです。dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)

AGIPCAssetsController.m:

- (void)loadAssets
{
    [self.assets removeAllObjects];

    __ag_weak AGIPCAssetsController *weakSelf = self;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{

        __strong AGIPCAssetsController *strongSelf = weakSelf;

        @autoreleasepool {
            [strongSelf.assetsGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {

                if (result == nil) 
                {
                    return;
                }

                AGIPCGridItem *gridItem = [[AGIPCGridItem alloc] initWithImagePickerController:strongSelf.imagePickerController asset:result andDelegate:strongSelf];
                if ( strongSelf.imagePickerController.selection != nil && 
                    [strongSelf.imagePickerController.selection containsObject:result])
                {
                    gridItem.selected = YES;
                }
                [strongSelf.assets addObject:gridItem];
            }];
        }

        dispatch_async(dispatch_get_main_queue(), ^{

            [strongSelf reloadData];

        });

    });
    [strongSelf reloadData];

}
4

4 に答える 4

6

AGIPCGridItemのサブクラスですUIViewバックグラウンド スレッドで UIKit オブジェクトを操作しないでください。

バックグラウンド スレッドが必要であることを確認し、必要な場合は、負荷の高いタスクのみをバックグラウンドに配置します。を作成するUIViewことは、その場合ではありません。

また、PRIORITY_LOWuse simpleの使用はお勧めしませんPRIORITY_DEFAULT

編集:なぜiOS 6 で機能したのか知りたい場合: UIKit の実装の詳細です。それはまだ間違っていましたが、どういうわけかあなたが期待したことをしました。

于 2013-10-08T09:58:50.793 に答える
0

iMartin の回答「AGIPCGridItem は UIView のサブクラスです。バックグラウンド スレッドで UIKit オブジェクトを操作しないでください。」を強調しました。彼はそれを手に入れました。

iOS6 を 7 に移行したときに、非常によく似た問題が発生しました。バックグラウンド スレッドで ALAssets リクエストをディスパッチしていました。フェッチが完了したら、UIImageView、UILabel、およびラッパーを構築し、このオブジェクトをメイン/フォアグラウンド スレッドに送信してレンダリングします。これは iOS6 では問題なく動作しましたが、7 では約 20 秒間描画されませんでした。タッチなどの UI イベントの後に描画されることがあります。

バックグラウンドで ALAsset をフェッチし、それをイメージ ビューを作成したメイン スレッドに送信するなどの修正が行われました。今では魅力的に動作します。

于 2013-10-11T21:17:43.203 に答える
0

グローバル ディスパッチ キューは共有リソースです。DISPATCH_QUEUE_PRIORITY_LOWタスクは、優先度の高いキュー内の他のすべてのタスクが実行された後に実行されます。キューが優先度の高いブロックを大量に送信している場合、DISPATCH_QUEUE_PRIORITY_LOWタスクが長時間実行されない可能性があります。

これは、同時実行プログラミング ガイドおよび libdispatch のマニュアル ページに記載されています。

したがって、基本的には、他の優先度の高いタスクが忙しくしていて、優先度の低いタスクに行く機会がありません。

于 2013-10-08T09:37:33.600 に答える