枚举对象阻止主UI



我尝试在异步块中的照片中获取所有gif:

DispatchQueue.main.async {
  allImageFetchResult.enumerateObjects(options: .concurrent, using: {(asset, _, _) in
    if asset.isGIF {
      assetSet.insert(asset)
    }
  })
}

但是,似乎阻止用户界面,直到完成块任务之前,该界面才响应我的触摸操作。

dispatchqueue.main.async允许UI更新异步在主线程上。列举对象时,您正在执行同步任务。请参阅https://developer.apple.com/documentation/photos/phfetchresult/1620998-enumerateObjects

讨论:此方法同步执行。

所以您应该做的是事先枚举,仅在调度中更新UI。

在这里您从主线程中获取GIF,这就是您的UI不响应触摸的原因。而不是主要队列使用dispatchqueue.global从背景线程提取gif。尝试使用

DispatchQueue.global().async {
 allImageFetchResult.enumerateObjects(options: .concurrent, using: {(asset, _, _) in
    if asset.isGIF {
      assetSet.insert(asset)
    }
  })
}

UI无反应,因为您在UI线程(主排队(上获取数据。如果您希望您的UI继续响应迅速,则需要将获取代码移至另一个线程(可能是背景队列(

完成一旦完成后,请完成数据处理程序。

      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {  
          self.fetchAllPhotos{ data in 
            print(data)
            dispatch_async(dispatch_get_main_queue()) {
              // update the user interface..
             print("updating UI")
            }
         }
      }
    func fetchAllPhotos(completion: (data:PHAsset) -> ())
    {
     allImageFetchResult.enumerateObjects(options: .concurrent, using: {(asset, _, _) in
        if asset.isGIF {
          assetSet.insert(asset)
        }
      })
      completion(assetSet)
    }

最新更新