Мы реализовали расширение для NSData, которое асинхронно сохраняет данные в URL. Вот краткая версия функции.
extension NSData {
func writeToURL1(url:NSURL, completion: () -> Void) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { [weak self] in
guard let strongSelf = self else { return }
strongSelf.writeToURL(url, atomically: true)
completion()
})
}
}
Вот как мы это используем:
var imageData = UIImageJPEGRepresentation(image, 0.8)
imageData?.writeToURL(someURL) { in ... }
Проблема, конечно, в том, что если imageData
будет освобожден до завершения операции записи, strongSelf
будет равно нулю, и обработчик завершения никогда не будет вызван.
Есть два решения этой проблемы.
- удалить
[weak self]
(т.е. иметь сильную ссылку наself
вwriteToURL1
. - ссылка
imageData
в блоке завершения (т.е.imageData?.writeToURL(someURL) { in imageData = nil ... }
)
Какой подход более дружелюбен к Swift и какой подход нам следует выбрать?
Благодарю вас!