Ios 枚举对象块主用户界面?

Ios 枚举对象块主用户界面?,ios,multithreading,Ios,Multithreading,我尝试在异步块中获取照片中的所有GIF,如下所示: DispatchQueue.main.async { allImageFetchResult.enumerateObjects(options: .concurrent, using: {(asset, _, _) in if asset.isGIF { assetSet.insert(asset) } }) } 但是,它似乎阻止了用户界面,在阻止任务完成之前,界面不会响应我的触摸操作。用户界面没有响应,因

我尝试在异步块中获取照片中的所有GIF,如下所示:

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