Эта ошибка имеет довольно простое объяснение:
к тому времени, когда URLSession завершает свою работу, экземпляр ImageLoader не существует, потому что никто не хранит ссылку на него. Это может произойти, когда вы просто создаете этот экземпляр в переменной области видимости функции. (Может быть, в какой-то функции, например viewDidLoad). Этот cra sh полезен, так как говорит, что загрузчик используется неправильно. В случае использования слабого я или захвата всего экземпляра, cra sh не произойдет, но у вас будет много ImageLoaders со своими собственными кэшами с одним изображением. Таким образом, в его значении не будет никакого кэширования.
Чтобы решить эту проблему, после создания экземпляра ImageLoader вам следует сохранить ссылку на него в переменной класса / структуры, которая его потребляет, и передать ее другому потребителю. кому нужен такой же кеш. (Техника внедрения зависимостей c является хорошим подходом для этого). Таким образом, один кэш с некоторым количеством элементов будет существовать и работать.
Или самый простой способ - создать общий экземпляр ImageLoader и использовать его только, таким образом, он также гарантирует один экземпляр с одним заполненным кешем.