当我试图在Xcode中看到代码时,我得到了以下信息,这没有多大帮助:

所以,这就是问题所在。如果您对如何在照片应用程序中实现它有任何想法,认为它是如此快速和响应迅速,或者如果您对我的实现有任何建议,我将非常感谢您的帮助。
1)我试过使用Operation
和OperationQueue
使用集合视图,启用预取。这将快速加载视图控制器,但在滚动时会丢弃帧。
2)现在我正在使用滚动视图和GCD
但是它加载viewcontroller的时间太长(因为它一次将所有过滤器应用于其中的所有按钮),但随后它会平滑滚动。
注:要回答这个问题,不需要阅读下面的部分(我相信),但是如果您对我如何尝试实现功能感兴趣,欢迎阅读。
对于所有过滤器的实现,我使用一个名为Filters
它负责启动每个过滤器并将其附加到一个数组中。
struct Filters {
var image: UIImage
var allFilters: [CIFilter] = []
init(image: UIImage) {
self.image = image
guard let sepia = Sepia(image: image) else {return}
allFilters.append(contentsOf: [sepia, sepia, sepia, sepia, sepia, sepia, sepia, sepia, sepia, sepia, sepia, sepia, sepia])
}
}
现在我只使用一个过滤器。Sepia
是的子类CIFilter
. 我已经创建了它作为一个子类,因为将来我将从中创建一个自定义的子类。这是它的实现:
class Sepia: CIFilter {
var inputImage: CIImage?
var inputIntensity: NSNumber?
@objc override var filterName: String? {
return NSLocalizedString("Sepia", comment: "Name of a Filter")
}
convenience init?(image: UIImage, inputIntensity: NSNumber? = nil) {
self.init()
guard let cgImage = image.cgImage else {
return nil
}
if inputIntensity != nil {
self.inputIntensity = inputIntensity
} else {
self.setDefaults()
}
let inputImage = CIImage(cgImage: cgImage)
self.inputImage = inputImage
}
override func setDefaults() {
inputIntensity = 1.0
}
override var outputImage: CIImage? {
guard let inputImage = inputImage, let inputIntensity = inputIntensity else {
return nil
}
let filter = CIFilter(name: "CISepiaTone", withInputParameters: [kCIInputImageKey: inputImage, kCIInputIntensityKey: inputIntensity])
return filter?.outputImage
}
}
在视图控制器中viewDidLoad
我发起过滤器
结构:
self.filters = Filters(image: image)
然后我调用一个方法来配置一些视图(filterViews
)基于filters.allFilters
数组并对其进行迭代,并调用一个获取缩略图的方法UIImage
并对其应用筛选器,然后在完成处理程序中返回它(我使用DispatchGroup
出于调试原因)。下面是将筛选器应用于缩略图的方法:
func imageWithFilter(filter: CIFilter, completion: @escaping(UIImage?)->Void) {
let group = DispatchGroup()
group.enter()
DispatchQueue.global().async {
guard let outputImage = filter.value(forKey: kCIOutputImageKey) as? CIImage, let cgImageResult = self.context.createCGImage(outputImage, from: outputImage.extent) else {
DispatchQueue.main.async {
completion(nil)
}
group.leave()
return
}
let filteredImage = UIImage(cgImage: cgImageResult)
DispatchQueue.main.async {
print (filteredImage)
completion(filteredImage)
}
group.leave()
}
group.notify(queue: .main) {
print ("Filteres are set")
}
}
上面的打印语句和过滤后的图像地址很快就会打印出来,但是图像不会出现在视图中。
我试过用Time Profiler
但它给了我一些奇怪的结果。例如,它显示了在backtrace根目录中执行相当长的时间:

当我试图在Xcode中看到代码时,我得到了以下信息,这没有多大帮助:

所以,这就是问题所在。如果你对如何在照片应用程序中实现它有任何想法,它是如此快速和响应,或者如果你对我的实现有任何建议,我将非常感谢你的帮助。