0

バックグラウンド スレッドで for ループを実行するようにこのコードを変換しようとしています。

-(void)prepareLayout {
    [super prepareLayout];

    if (!_animator) {
    _animator = [[UIDynamicAnimator alloc] initWithCollectionViewLayout:self];
    CGSize contentSize = [self collectionViewContentSize];
    NSArray *items = [super layoutAttributesForElementsInRect:CGRectMake(0, 0, contentSize.width, contentSize.height)];
            for (UICollectionViewLayoutAttributes *item in items) {
                     UIAttachmentBehavior *spring = [[UIAttachmentBehavior alloc] initWithItem:item attachedToAnchor:item.center];

                    spring.length = 0;
                    spring.damping = self.springDamping;
                    spring.frequency = self.springFrequency;

                    [_animator addBehavior:spring];

            }
}

}

私はこれを試しましたが、正しく動作しません...ラグは解消されますが、一部の行が欠落しているか、コレクションビューの奇妙な位置にあります.forループがディスパッチで正しく動作していません... - (void)prepareLayout { [super prepareLayout];

    if (!_animator) {
    _animator = [[UIDynamicAnimator alloc] initWithCollectionViewLayout:self];
    CGSize contentSize = [self collectionViewContentSize];
    NSArray *items = [super layoutAttributesForElementsInRect:CGRectMake(0, 0, contentSize.width, contentSize.height)];

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(queue, ^{
            for (UICollectionViewLayoutAttributes *item in items) {
                     UIAttachmentBehavior *spring = [[UIAttachmentBehavior alloc] initWithItem:item attachedToAnchor:item.center];

                    spring.length = 0;
                    spring.damping = self.springDamping;
                    spring.frequency = self.springFrequency;

                    [_animator addBehavior:spring];
            }

           dispatch_sync(dispatch_get_main_queue(), ^{

           });
        });
    }
}

他のバリエーションを試しましたが、うまくいきませんでした...誰かがこのコードをバックグラウンドスレッドで適切に実行するように変換するのを手伝ってくれると助かります...ありがとう

4

1 に答える 1

0

prepareLayoutバックグラウンド スレッドに安全に置くことができるあなたの部分はありません。UIKit 要素には、メイン スレッドでのみアクセスする必要があります。

prepareLayoutラグを引き起こす可能性があるほど頻繁に呼び出されるべきではありません。非常に頻繁に呼び出されている場合は、レイアウトが頻繁に無効化されている理由を確認する必要があります。

コレクション ビューが非常に大きい場合 (たとえば、数百のアイテム)、ビヘイビアーにアタッチするアイテムが多すぎることが問題である可能性があります。アイテムは、作成時にビヘイビアーにアタッチし、削除したら削除する必要があります。UIKit Dynamics は、数百または数千のアイテムを管理するようには設計されていません。

WWDC 2013の Advanced Techniques with UIKit Dynamicsを必ずご覧ください。 UICollectionView と UIKit Dynamics の組み合わせは明らかではないことがわかりました (スライド デッキの 110 ページあたりから始めてください)。をオーバーライドしていない場合はlayoutAttributesForElementsInRect:、その議論に注意を払うようにしてください。

于 2013-12-26T05:04:17.490 に答える