首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在后台访问PHPhotoLibrary

在后台访问PHPhotoLibrary
EN

Stack Overflow用户
提问于 2016-07-30 15:57:59
回答 1查看 906关注 0票数 4

我有一个NSURLDownloadTask,它成功地在后台下载文件(大图像或视频文件)。我成功地复制了url并调用这个函数将我的url保存到照片库。如您所见,我想发送一个UILocalNotification通知用户他们的下载已经完成。

我的问题是,当应用程序处于后台时,PHPhotoLibrary.sharedPhotoLibrary().performChanges将被调用,但它的完成块不会被调用。(不过,这款应用程序又回到了前台)我试着评论一下主线程,看看它是否有帮助,但它没有用。我不想在完成块之前发送本地通知,因为我想在下载成功/失败的通知中告诉用户。

我想我可以在NSURLDownloadDelegateTask方法中发送通知。这将使用户知道文件已成功下载,但不知道是否将其保存到他们的照片中是成功的。我不想告诉我的用户他们的下载是成功的,然后他们无法在他们的照片库找到它。

下面是我访问和修改的代码。

代码语言:javascript
复制
func saveURLToPhotosLibrary(url: NSURL, fileName: String) {

        if let fileExtension = url.pathExtension {
            PHPhotoLibrary.sharedPhotoLibrary().performChanges({

                let fileUnmanagedIDTag = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, nil)

                let fileIDTag = fileUnmanagedIDTag?.takeRetainedValue()
                if let fileUTType = fileIDTag {
                    if UTTypeConformsTo(fileUTType, kUTTypeImage) {
                        PHAssetChangeRequest.creationRequestForAssetFromImageAtFileURL(url)
                    } else if UTTypeConformsTo(fileUTType, kUTTypeMovie){
                        PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(url)
                    }
                } else {
                    print("Error getting type of file from download")
                }

            }) { (success, error) in
                //dispatch_async(dispatch_get_main_queue(), {

                    if success {
                        print("finished")
                        self.sendLocalNotification(downloadSuccessful: true, error : nil, fileName: fileName)
                    } else {
                        if let error = error {
                            self.sendLocalNotification(downloadSuccessful: false, error : error, fileName: fileName)
                        }
                    }
                //})
            }
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-02 01:02:17

好吧找到我的解决方案了。发现应用程序在没有代码运行后立即被挂起,因此在我的完成处理程序准备好调用时,应用程序就会被挂起。我使用UIApplications共享实例来创建一个新的后台任务。这使我的应用程序有足够的时间调用完成处理程序。然后,一旦我收到通知,我就会结束后台任务。

代码语言:javascript
复制
func saveURLToPhotosLibrary(url: NSURL, fileName: String) {

    //Returns id to later be passed into method that ends task.
    let backgroundID : Int = UIApplication.sharedApplication().beginBackgroundTaskWithName("Save to Photo Library Task") {
        print("Background task expired")
    }

    if let fileExtension = url.pathExtension {
        PHPhotoLibrary.sharedPhotoLibrary().performChanges({

            let fileUnmanagedIDTag = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, nil)

            let fileIDTag = fileUnmanagedIDTag?.takeRetainedValue()
            if let fileUTType = fileIDTag {
                if UTTypeConformsTo(fileUTType, kUTTypeImage) {
                    PHAssetChangeRequest.creationRequestForAssetFromImageAtFileURL(url)
                } else if UTTypeConformsTo(fileUTType, kUTTypeMovie){
                    PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(url)
                }
            } else {
                print("Error getting type of file from download")
            }


        }) { (success, error) in

                if success {
                    print("finished")
                    self.sendLocalNotification(downloadSuccessful: true, error : nil, fileName: fileName)
                } else {
                    if let error = error {
                        self.sendLocalNotification(downloadSuccessful: false, error : error, fileName: fileName)
                    }
                }
            //End background task here passing in id of task from earlier.
            UIApplication.sharedApplication().endBackgroundTask(backgroundID)
        }
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38675816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档