gpt4 book ai didi

ios - 在 UIImageWriteToSavedPhotosAlbum - Swift 3 中使用 contextInfo、UnsafeRawPointer

转载 作者:搜寻专家 更新时间:2023-11-01 06:17:33 24 4
gpt4 key购买 nike

我有一个 UITableView。当点击一个单元格时,我的应用程序会生成相关图像。图像生成是在后台线程上完成的,因为一些图像需要相当长的时间来渲染。渲染图像后,将在主线程上调用 UIImageWriteToSavedPhotosAlbum

由于任意数量的 UIImageWriteToSavedPhotosAlbum 任务可能以任意顺序进行,我需要一种方法来跟踪每个任务。我希望将所选单元格的 indexPath 存储为 contextInfo,并将其传递给 UIImageWriteToSavedPhotosAlbum

当调用 image:didFinishSavingWithError:contextInfo: 时,我需要从 contextInfo 中获取 indexPath。

但是,UIImageWriteToSavedPhotosAlbum 的绝大多数在线示例都为 contextInfo 传递了 nil。

我已经阅读了官方文档、Swift 3 指针迁移指南、头文件、使用桥接和转换的 Objective-C 代码,以及关于 UnsafeMutableRawPointer/主题的大量 SO 线程UnsafeRawPointer

最终结果:我被无数的选项弄糊涂了,不知道我是否遗漏了一些明显的东西,我是否应该对指针数据执行 load(),是否应该调用 unsafeBitCast (),还是应该祭祀山羊给神灵。

或者,重新评估我的职业,成为一名木匠。

Q1。如何以适合 contextInfo 的形式存储 IndexPath 的实例?

Q2。一旦调用了 image:didFinishSavingWithError:contextInfo,我如何从 contextInfo 中形成一个 IndexPath,以便获取我存储的数据?谢谢。

最佳答案

最后,谢天谢地,偶然发现了关于 SO 的正确答案:

Swift 2 - UnsafeMutablePointer<Void> to object

基于上述答案,下面是一个解决方案。欢迎任何改进或建议。

为了便于使用和调试,我将数据包装在引用类型中:

class ImageWritingContext : NSObject
{
var indexPath = IndexPath()
// ...
}

数据需要牢牢掌握。在这种情况下,在数组属性中。

fileprivate var imageWritingContexts = [ImageWritingContext]()

当需要绘制时,我们将数据粘贴到包装器中并将包装器添加到数组中。

let context = ImageWritingContext()
context.indexPath = indexPath
self.imageWritingContexts.insert(context, at: 0)

现在是魔术。

let contextRawPointer = UnsafeMutableRawPointer(Unmanaged.passUnretained(self.imageWritingContexts[0]).toOpaque())

我们到了吗,我们到了吗?

let completionTarget: AnyObject = self
let completionSelector = #selector(self.image(_:didFinishSavingWithError:contextInfo:))

UIImageWriteToSavedPhotosAlbum(image,
completionTarget,
completionSelector,
contextRawPointer)

回调:

func image(_ image: UIImage,
didFinishSavingWithError error: Error?,
contextInfo: UnsafeRawPointer)
{
// Perform error checking here.

// Extract the data. Pop some valium first.
let context: ImageWritingContext = Unmanaged<ImageWritingContext>
.fromOpaque(contextInfo)
.takeUnretainedValue()
let indexPath = context.indexPath

// Do something with the data.

// Remember to remove the context from self.imageWritingContexts!
}

关于ios - 在 UIImageWriteToSavedPhotosAlbum - Swift 3 中使用 contextInfo、UnsafeRawPointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41093735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com