2014-10-25 2 views
2

Можно ли загрузить UIImage в фоновый поток без проблем с резьбой? Если это не лучший способ сделать это? Я не буду использовать IOS 8. Это, как я сделать это прямо сейчас:Загрузить UIImage в фоновом режиме Thread

dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 
    dispatch_async(backgroundQueue, ^{ 
     UIImage *image = [UIImage imageNamed: fileName]; 

     // only update UI on the main thread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self setImage: image]; 
     }); 

    }); 
+0

Что не так с вами в текущем примере? –

+0

У меня когда-то были ошибки CG ImageIO при загрузке изображений в фоновом режиме, поэтому я задавался вопросом, почему они происходят. Люди здесь говорили, что вы не должны загружать UIImages в фоновом режиме, и это исправит. – Max

+0

Может быть, 'imageWithContextOfURl' должен вам помочь, просто вместо url введите путь ur' nsbundle' в качестве URL-адреса. http://stackoverflow.com/questions/4962561/set-uiimageview-image-using-a-url –

ответ

10

Что вы делаете структурно звук, но я не знаю, является ли imageNamed: потокобезопасной - и у меня нет повод полагать, что это так. Вы всегда должны предполагать, что вещи не являются потокобезопасными, если в документации не указано иное. В этом случае documentation specifically says что не:

Вы не можете предположить, что этот метод является поточно.

На мой взгляд, вы должны спросить себя, нужно ли вам вообще это делать. imageNamed: содержит механизм кэширования, который должен освобождать вас от того, что вас беспокоит. В любом случае преждевременная оптимизация - это трата вашего времени и возможностей. Здесь действительно проблема? Используйте инструменты, чтобы узнать; не используйте интуицию или инстинкт.

Если проблема в том, что ваши изображения слишком велики и в плохом выборе формата - например, вы используете очень большие JPEG-файлы, лучше было бы сосредоточиться на исправлении , что.

EDIT Документация iOS 9 теперь гласит: «В iOS 9 и более поздних версиях этот метод является потокобезопасным». Это говорит о том, что мой ответ верен и что проблема решена.

+1

Спасибо за быстрый ответ. Я понимаю, что есть кеширование с помощью imageNamed, но хотя первый нагрузка займет время. Я загружаю тяжелые изображения для фона, и я хочу представить их по мере их загрузки, поэтому они не видят никакого отставания. – Max

+0

Извините, это не имеет смысла. Если они требуют времени для загрузки, то это отставание, и это отставание не будет удалено магией только потому, что вы вызываете 'imageNamed:' в фоновом потоке. Я думаю, вы должны спросить себя, почему существует отставание. Если ваши изображения настолько велики, что им требуется много времени для загрузки, у вас уже серьезные проблемы. Нет абсолютно никакой точки загрузки изображения, большего, чем вы можете отображать; он тратит время, память и вычислительную мощность. Изображение, размер которого не больше, чем вы можете отображать, не займет много времени для загрузки, особенно если это «png». – matt

+5

Я видел, что '- [UIImage imageNamed:]' _used_, чтобы быть потокобезопасным ... до iOS 8. С тех пор я вижу много сбоев, вызванных вызовом его в фоновом потоке, что-то, что мы делая в течение многих лет без проблем. – DarkDust

Смежные вопросы