У меня есть NSURLDownloadTask
, который успешно загружает файлы в фоновом режиме (большие изображения или видеофайлы). И я успешно копирую URL-адреса и вызываю эту функцию, чтобы сохранить свой URL-адрес в библиотеке фотографий. Как видите, я хотел бы отправить UILocalNotification
, чтобы уведомить пользователя о том, что его загрузка завершена.
Моя проблема в том, что хотя PHPhotoLibrary.sharedPhotoLibrary().performChanges
будет вызываться, пока приложение находится в фоновом режиме, блок завершения не будет. (однако это вызвано тем, что приложение возвращается на передний план). Я попытался прокомментировать захват основного потока, чтобы увидеть, помогло ли это, но это не помогло. И я не хочу отправлять локальное уведомление перед блоком завершения, потому что я хочу сообщить пользователю в уведомлении об успешной/неудачной загрузке.
Я полагаю, что могу отправить уведомление методом NSURLDownloadDelegateTask
. Это позволит пользователю узнать, что файл был успешно загружен, но не будет ли успешно сохранено его на своих фотографиях. И я бы не хотел, чтобы мой пользователь сказал, что их загрузка прошла успешно, а затем они не смогли найти его в своей библиотеке фотографий.
Вот мой код, в котором я получаю доступ к библиотеке фотографий и изменяю ее.
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)
}
}
//})
}
}
}