OGeek|极客世界-中国程序员成长平台

标题: ios - 在 Swift 4 中,当我想要时转到下一个 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 20:45
标题: ios - 在 Swift 4 中,当我想要时转到下一个

我正在使用 for in 制作大约 20 个单元格项目。

但是在 for in 中有 DispatchQueue.main.async 并且 for in 在它结束之前进入下一个。

所以我想在 DispatchQueue.main.async 完成后完成。

这是代码:

for item in 0 ..< collectionView.numberOfItems(inSection: 0)
{
    let indexPath = IndexPath(item: item, section: 0)
    var photoHeight = CGFloat(50.0)

    _ = delegate.collectionView(collectionView, heightForPhotoAtIndexPath: indexPath)
    { (value) in
        DispatchQueue.main.async
            {
                photoHeight = value

                let height = self.cellPadding * 2 + photoHeight
                let frame = CGRect(x: xOffset[column], y: yOffset[column], width: columnWidth, height: height)
                let insetFrame = frame.insetBy(dx: self.cellPadding, dy: self.cellPadding)

                let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath)
                attributes.frame = insetFrame
                self.cache.append(attributes)

                self.contentHeight = max(self.contentHeight, frame.maxY)
                yOffset[column] = yOffset[column] + height

                column = column < (self.numberOfColumns - 1) ? (column + 1) : 0
            }
    }

    // DispatchQueue.main.async is not finish, but it runs here.
}



Best Answer-推荐答案


你甚至不需要在这里使用 DispathQueue.main.async。你没有做任何 UI 工作,所以你不必在主线程上。

异步调用不会像您期望的那样按顺序运行。想想网络调用..

print('starting network call')

NetworkClient.get(url) { response, error in 
    print('returned from network')
}

print('function complete')

如果你这样调用它,可能的输出是:

starting network call

function complete

returned from network

这是因为异步函数被调度并需要时间来完成,但在此过程中执行可以继续。一旦网络调用完成,回调/完成处理程序将被调用,然后该代码将运行。

Here is another example Swift 中的异步函数调用次数

关于ios - 在 Swift 4 中,当我想要时转到下一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53041027/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4