Обработчик завершения приводит к тому, что Deinit не вызывается - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть сетевая задача, которая содержит обработчик завершения, позволяющий мне определить, если и когда задача успешно завершена;

func performUpload(url: URL, completionHandler: @escaping (_ response: Bool) -> ()) {
    photoSave.savePhotoRemote(assetURL: url) { response in
        completionHandler(response)
    }
}

Я вызываю эту функцию из другого UIView, используя следующее;

UploadHelper.shared.performUpload(url: fileAssetPath) { response in
    if response {
       // do stuff
    }
}

Что я замечаю, так это то, что когда я фиксирую ответ и do stuff , класс, вызвавший эту функцию, никогда не деиницирует. Однако, если я изменю свою функцию на следующую:

UploadHelper.shared.performUpload(url: fileAssetPath) { response in }

и ничего не делать с ответом, класс будет deinit.

Что я делаю не так с моей функцией? Я хотел бы получить ответ соответствующим образом, но не за счет того, что мой класс не был освобожден из памяти.

1 Ответ

1 голос
/ 29 апреля 2019

У вас есть цикл сохранения. Сломать это. Изменение

UploadHelper.shared.performUpload(url: fileAssetPath) { response in
    if response {
       // do stuff
    }
}

до

UploadHelper.shared.performUpload(url: fileAssetPath) { [unowned self] response in
    if response {
       // do stuff
    }
}
...