我尝试在异步块中的照片中获取所有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)
}