UIImage imageNamed неожиданно вернул ноль - PullRequest
2 голосов
/ 19 сентября 2019

У меня есть собственный подкласс кнопок в моем приложении, который при нажатии отображает анимацию пользовательского индикатора активности.Он реализован с серией из 32 изображений с использованием свойства UIImageView animationImages.Загрузка всех этих изображений связана с заметной задержкой, поэтому я кеширую их в статический массив в кнопке и загружаю их в фоновом режиме при запуске.Они называются «buy_anim0001.png» - «buy_anim0032.png».У меня есть этот метод, и я называю его в конце application:didFinishLaunchingWithOptions:

+(void)setup
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        CFTimeInterval start = CACurrentMediaTime();
        NSMutableArray<UIImage *> *images = [[NSMutableArray alloc] init];
        int numImages = 32;
        for (int i = 1; i <= numImages; i++)
        {
            NSString *title = [NSString stringWithFormat:@"buy_anim%04i.png", i];
            UIImage *img = [UIImage imageNamed:title];
            [images addObject:img];
        }
        CFTimeInterval end = CACurrentMediaTime();
        NSLOG(@"Took %.3f seconds to load buy button images", end - start);

        dispatch_async(dispatch_get_main_queue(), ^{
            _images = images;
        });
    });
}

У меня никогда не было сбоев здесь, в разработке или во внешнем бета-тестировании приложения, но теперь я вижу отчеты о сбояхотсюда, жалуясь на «[__NSArrayM insertObject: atIndex:]: object не может быть nil».

Некоторые примечания:

  • Все сбои на iOS 12 (потому что эта версияприложение требует iOS 12, а 13 все еще на расстоянии нескольких часов от доставки)
  • Приложение работает в фоновом режиме 75% времени, но я пытался заставить это произойти, пока приложение нена переднем плане, и у меня нет сбоев.
  • Я дважды проверил наименование изображения, но если бы это было проблемой, то это было бы обнаружено в отладке или бета-версии.
  • Там нетпроблемы с именами в именах файлов.
  • Не существует @ 2x версий изображений, и они находятся в проекте, а не в каталоге ресурсов, поэтому я не думаю, что проблема заключается в прореживании приложения.

Итак ... что может заставить UIImage imageNamed вернуть nil один раз в агПовторите время, когда имя изображения будет правильным?

Обновление: Я обнаружил, что размещение изображений в каталоге ресурсов вместо пакета заставляет их загружаться в порядке быстрее (aсекунды или две с точностью до одной десятой секунды).Это, вероятно, устраняет необходимость загружать их в фоновом режиме, поэтому я по крайней мере буду делать это в следующем выпуске.Это может решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...