如何延迟执行代码直到重新加载集合视图数据?

时间:2018-04-07 03:11:15

标签: swift

我正在尝试创建一个具有两个集合视图的应用程序。我想首先填充第一个集合视图,然后填充第二个集合视图。首先,我将self的委托设置为photoCollectionView.reloadData()。然后,我通过调用photoCollectionView.reloadData()来填充集合视图。但是,我希望photoCollectionView.dataSource = self photoCollectionView.reloadData() // I want this code to complete before executing anything else under it. media.removeAll() let assetVideo = PHAsset.fetchAssets(with: PHAssetMediaType.video , options: nil) assetVideo.enumerateObjects({ (object, count, stop) in self.media.append(object) }) self.media.reverse() videoControllerView.dataSource = self videoControllerView.reloadData() 在执行任何进一步的代码之前首先完成,因为当我在其下面包含代码时,我最初尝试填充的集合视图不会填充。但是,当我删除代码时,它确实填充。我尝试使用DispatchQueue,但我没有运气。

photoCollectionView.dataSource = self
photoCollectionView.reloadData()

DispatchQueue.main.async {
    self.media.removeAll()

    let assetVideo = PHAsset.fetchAssets(with: PHAssetMediaType.video , options: nil)
    assetVideo.enumerateObjects({ (object, count, stop) in
        self.media.append(object)
    })

    self.media.reverse()

    self.videoControllerView.dataSource = self
    self.videoControllerView.reloadData()
}

添加DispatchQueue后的代码。执行此代码时,不会填充集合视图。但是,如果我们注释掉DispatchQueue中的所有代码,它就会填充。

<div class="col-lg-8 col-md-8 col-sm-8">
  <ul class="nav nav-tabs">
    <li class="active"><a data-toggle="tab" href="tab1">Tab1 Heading</a><li>
    <li><a data-toggle="tab" href="tab2">Tab2 Heading</a><li>
  </ul>
  <div class="tab-content">
    <div id="tab1" class="tab-pane active in">
      <h3>content for tab1</h3>
    </div>
    </div id="tab2" class="tab-pane fade">
      <h3>content for tab2</h3>
    </div>
  </div>
</div>
<button type="submit" class="btn btn-primary" (click)="switchtab()"> Tab selection</button>

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

遗憾的是,

reloadData没有完成处理程序,但通过将调用放入CATransaction块来实现相同的效果相对容易。

CATransaction.begin()
CATransaction.setCompletionBlock {
    // this runs after reloadData is done
}
photoCollectionView.reloadData()
CATransaction.commit()