我正在使用 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-推荐答案 strong>
你甚至不需要在这里使用 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/
|