Ios 枚举对象块主用户界面?
我尝试在异步块中获取照片中的所有GIF,如下所示:Ios 枚举对象块主用户界面?,ios,multithreading,Ios,Multithreading,我尝试在异步块中获取照片中的所有GIF,如下所示: DispatchQueue.main.async { allImageFetchResult.enumerateObjects(options: .concurrent, using: {(asset, _, _) in if asset.isGIF { assetSet.insert(asset) } }) } 但是,它似乎阻止了用户界面,在阻止任务完成之前,界面不会响应我的触摸操作。用户界面没有响应,因
DispatchQueue.main.async {
allImageFetchResult.enumerateObjects(options: .concurrent, using: {(asset, _, _) in
if asset.isGIF {
assetSet.insert(asset)
}
})
}
但是,它似乎阻止了用户界面,在阻止任务完成之前,界面不会响应我的触摸操作。用户界面没有响应,因为您正在用户界面线程(主队列)上获取数据。如果希望UI继续响应,则需要将提取代码移动到另一个线程(可能是后台队列)UI没有响应,因为您正在UI线程(主队列)上提取数据。如果您希望UI继续响应,则需要将提取代码移动到另一个线程(可能是后台队列)此处您正在从主线程提取GIF,这就是UI不响应触摸的原因。使用DispatchQueue.global从后台线程获取GIF,而不是主队列。试用
DispatchQueue.global().async {
allImageFetchResult.enumerateObjects(options: .concurrent, using: {(asset, _, _) in
if asset.isGIF {
assetSet.insert(asset)
}
})
}
在这里,您正在从主线程获取GIF,这就是您的UI不响应触摸的原因。使用DispatchQueue.global从后台线程获取GIF,而不是主队列。试用
DispatchQueue.global().async {
allImageFetchResult.enumerateObjects(options: .concurrent, using: {(asset, _, _) in
if asset.isGIF {
assetSet.insert(asset)
}
})
}
DispatchQueue.main.async允许UI更新在主线程上异步进行。枚举对象时,您正在执行同步任务。看 讨论:此方法同步执行
因此,您应该事先枚举,只更新DispatchQueue中的UI。DispatchQueue.main.async允许UI在主线程上异步更新。枚举对象时,您正在执行同步任务。看 讨论:此方法同步执行
因此,您应该做的是预先枚举,并且只更新DispatchQueue中的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)
}
让完成处理程序在抓取完成后获取数据。如下面所示,请检查它
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)
}
ui是否仍然冻结?需要多少时间??实际上,您正在获取存储在设备中的所有资产,然后检查它是否为GIF,因此如果您的设备中有大量资产,则速度会稍慢。可能我应该将其放入
DispatchQoS.userInitiated
?ui是否仍然冻结?需要多少时间??实际上,您正在获取存储在设备中的所有资产,然后检查它是否为GIF,因此如果您的设备中有大量资产,则速度会稍慢。可能我应该将其放入DispatchQoS.userInitiated
?