gpt4 book ai didi

ios - 使用新的照片框架保存一大批照片?

转载 作者:技术小花猫 更新时间:2023-10-29 10:28:09 25 4
gpt4 key购买 nike

我正在尝试使用 iOS 8 中新的 PHAssetChangeRequest 类将一大批照片保存到照片库中。问题是,看起来保存照片的守护进程本身意外崩溃了照片数量适中(我正在尝试大约 500 张)。任何人都知道如何绕过这个限制?它是守护程序本身的内存使用问题吗?它也可能是更改 block 的超时限制,因为在下面的前 2 个日志语句之间有一个不是微不足道的间隙。

assetsd 守护进程不应该已经考虑到这个用例吗,因为这样的事情几乎就是新照片框架中的 super 复杂模型和设计应该做的能处理吗?文档示例本身展示了保存照片的能力。

这是我的代码示例:

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
for (NSURL * url in fileURLs) {
PHAssetChangeRequest * assetReq = [PHAssetChangeRequest creationRequestForAssetFromImageAtFileURL:url];
}
NSLog(@"Added %d assets",fileURLs.count);
} completionHandler:^(BOOL success, NSError *error) {
if (!success){
NSLog(@"%@",error);
}
}];

这就是我的输出:

... Added 501 assets
... Connection to assetsd was interrupted or assetsd died
... Error Domain=NSCocoaErrorDomain Code=-1 "The operation couldn’t be completed. (Cocoa error -1.)

我什至在PHPhotoLibrary中尝试了同步performChangesAndWait方法,但它也有同样的问题。

我乐于接受建议/想法,我被卡住了! :(

最佳答案

这个想法是小批量进行。 PHPhotoLibrary::performChanges 一次提交更改请求,因此即使它能够完成,您也无法从委托(delegate)或 block 中获得任何进度更新。 2017 WWDC session "What's New in Photos APIs"附带一个示例应用程序“Creating Large Photo Libraries for Testing”,它就是这样做的。每个 performChanges 都提交了 10 张图像,UI 更新来自 performChanges 的完成 block ,信号量会阻塞线程,直到处理完一批。我在这里发布重要的代码片段:

private func addPhotos() {
let batchSize = min(photosToAdd, maxBatchSize)
if batchSize <= 0 || !active {
isAddingPhotos = false
active = false
return
}

workQueue.async {
let fileURLs = self.generateImagesAndWriteToDisk(batchSize: batchSize)
self.createPhotoLibraryAssets(with: fileURLs)

DispatchQueue.main.async {
self.addPhotos()
}
}
}

private func createPhotoLibraryAssets(with imageFileURLs: [URL]) {
photoLibrarySemaphore.wait() // Wait for any ongoing photo library

PHPhotoLibrary.shared().performChanges({
let options = PHAssetResourceCreationOptions()
options.shouldMoveFile = true
for url in imageFileURLs {
let creationRequest = PHAssetCreationRequest.forAsset()
creationRequest.addResource(with: .photo, fileURL: url, options: options)
}
}) { (success, error) in
if !success {
print("Error saving asset to library:\(String(describing: error?.localizedDescription))")
}
self.photoLibrarySemaphore.signal()
}
}

上面的 generateImagesAndWriteToDisk 是您需要用任何方法替换的方法,以返回一批大约 10 个照片 url。我个人不喜欢写递归。代码可以轻松更改为非递归样式。

关于ios - 使用新的照片框架保存一大批照片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26182974/

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