Ошибка подробно описана в этом ответе .
Проблема с вашим кодом в том, что первое закрытие
fileprivate func fetchUserAvatar(_ internalUrl : URL, externalUrl : URL,_ task : inout URLSessionTask?, completion : @escaping (_ image : UIImage?) -> ()) {
fetchImage(externalUrl, task: &task, completion: { image in // <-- HERE --
if image == nil {
- выход из закрытия. Так что когда код
if image == nil {
self.fetchImage(internalUrl, task: &task, completion: completion) // <-- HERE --
} else {
пытается записать в переменную task
, исходный вызов fetchUserAvatar
уже завершен.
Примечание: Я написал подобные комментарии <-- HERE --
в отрывки, чтобы уточнить, о какой строке я говорю. Также, пожалуйста, обязательно ознакомьтесь с ответом, который я привел выше, потому что он все прояснит.
Плохая новость заключается в том, что вам придется немного реорганизовать код, чтобы исправить ошибку. Для этого вам нужно будет изменить сигнатуры как fetchUserThumbnailAvatar
, так и fetchUserAvatar
, и это сломает вызывающих абонентов; поэтому абоненты также должны быть изменены. Поэтому я не могу исправить это для вас, потому что исправление зависит от кода, которого у меня нет.