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 { [超级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中使用 UIKit Dynamics 的高级技术。我发现将 UICollectionView 和 UIKit Dynamics 结合起来并不明显(从幻灯片中的第 110 页开始)。如果您没有压倒一切layoutAttributesForElementsInRect:,请务必注意该讨论。

于 2013-12-26T05:04:17.490 回答