Потокобезопасность UIImage

Я знаю, что Apple официально рекомендует использовать UIKit только в основном потоке. Однако я также слышал заявления о том, что UIImage является поточно-ориентированным, начиная с iOS 4.0. Я не могу найти никаких документов, подтверждающих это утверждение.

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

 steipete28 мая 2013 г., 20:17
Кстати, здесь есть защита, чтобы всегда проверять доступ основного потока в UIKit:gist.github.com/steipete/5664345

Ответы на вопрос(6)

Документация Apple для UIImage

Image objects are immutable, so you cannot change their properties after creation. This means that you generally specify an image’s properties at initialization time or rely on the image’s metadata to provide the property value. It also means that image objects are themselves safe to use from any thread. The way you change the properties of an existing image object is to use one of the available convenience methods to create a copy of the image but with the custom value you want.

(Акцент мой)

Поэтому, по крайней мере, в текущей версии SDK от 13 мая 2014 года «объекты изображений сами по себе безопасны для использования из любого потока».

 15 мая 2015 г., 22:34
Я бы так подумал, но я призываю вас это проверить.
 30 июл. 2015 г., 09:31
@EricGoldberg Я просто запрещал звонитьUIImage инициализатор из нескольких потоков, и теперь я получил еще одну подсказку. Благодарю.
 19 мая 2014 г., 02:04
Это реальный ответ
 30 июл. 2015 г., 00:34
@Eonil - похоже, что могут быть некоторые предупреждения, как обнаружил проект AFNetworking при инициализации многих UIImage из разных потоков, особенно сimageWithData:, Посмотреть здесь:github.com/AFNetworking/AFNetworking/pull/2860
 15 мая 2015 г., 17:38
& quot; Чтобы использовать & quot ;, включает ли оно их создание? (инициализаторы)

UIImage не является потокобезопасным, или лучше работает только в основном потоке, как я испытал в моем текущем после некоторой отладки.

Надеюсь, это поможет. Я хотел бы иметь больше ясности об этом от Apple или, что еще лучше, класс UIImage, который может быть представлен в другом потоке. Не должно быть слишком сложно ...

редактировать: После некоторых исследований я обнаружил, что это «UIGraphicsGetImageFromCurrentImageContext ();» это вызывает проблемы. это немного не по теме, но, возможно, это поможет: https://coderwall.com/p/9j5dca

Благодаря Захари Вальдовски.

 19 мая 2014 г., 02:04
Больше не соответствует действительности (см. Ответ Эрика Голдберга)
 21 дек. 2016 г., 15:50
UIImage есть и всегда был неизменным классом; изображение, на которое оно ссылается, не может быть видоизменено. Это делает его 100% потокобезопасным.

Что ноого iOS: iOS 4.0 В заметках о ыпуске улучшения UIKit Framework ключают этот бит:

Drawing to a graphics context in UIKit is now thread-safe. Specifically: The routines used to access and manipulate the graphics context can now correctly handle contexts residing on different threads. String and image drawing is now thread-safe. Using color and font objects in multiple threads is now safe to do.

Так что UIImage яляется поточно-ориентироанным на iOS 4.0 и ыше.

 25 нояб. 2012 г., 04:15
Это утверждение не подразумевает, что UIImage безопасен в любом случае. Это просто говорит о том, что рисование изображения в контексте является потокобезопасным.

поскольку любой поток может пытаться получить доступ к контексту одновременно (одновременно). И, хотя это, как правило, нормально, в ситуациях с нехваткой памяти, например с расширением редактирования фотографий на устройствах iOS, два потока, обращающиеся к одному контексту, могут вызвать сбой приложения из-за нехватки памяти.

Это происходит при смешивании фильтров Core Image с операциями vImage. Оба потока являются поточно-ориентированными, но ARC не будет выпускать данные буфера vImage перед обработкой объекта Core Image, поэтому в какой-то момент у вас есть две копии изображения в памяти.

Соответственно, вы никогда не считаете свои знания о безопасности потоков полными, не понимая многопоточность и параллелизм, и это удваивается для любого ответа на вопросы о безопасности потоков. Вкратце: правильный вопрос заключается в том, как безопасность потоков применяется к использованию памяти, когда вы говорите об обработке изображений.

Если вы просто пинаете шины здесь, вам нужно подождать, чтобы задать свой вопрос, пока вы не столкнулись с реальной проблемой. Но если вы планируете следующий шаг, вам нужно знать, как выполнять команды обработки изображений последовательно и с помощью ручного освобождения. Вы должны спроектировать свое приложение так, чтобы в памяти находилась только одна копия обрабатываемого изображения. Никогда не полагайтесь на автоматическое освобождение & # x2014; поточно-ориентированный или нет & # x2014; ОНА НЕ БУДЕТ РАБОТАТЬ.

 21 дек. 2016 г., 15:49
Если вы собираетесь отказаться от рабочего ответа, попросите гримбу сказать, почему. Снайперская стрельба за плащом достойна только тьфу!
Решение Вопроса

что Apple рекомендует использовать элементы из UIKIt в основном потоке:

Note: For the most part, UIKit classes should be used only from an application’s main thread. This is particularly true for classes derived from UIResponder or that involve manipulating your application’s user interface in any way.

Поскольку UIImage не является производным от UIResponder, и вы фактически не отображаете его на интерфейсе / экране. Тогда выполнение операций с UIImages в другом потоке должно быть безопасным.

Это, однако, основано на моем опыте, я не видел никакой официальной документации об этом.

 18 мая 2012 г., 05:28
Материал либо потокобезопасен, либо не является таковым. CGImage не более или менее поточно-ориентированный, чем UIImage. Приведенная выше выдержка также не является гарантией безопасности потоков для UIImage. Он настоятельно советует не возиться с классами, производными от UIResponder, но ничего не говорит об UIImage. Не предполагайте, что это безопасно, просто потому, что это не UIResponder.What's new for iOS 4 Документы, с другой стороны, упоминают, что рисование UIImages и рисование на UIImages являются поточно-ориентированными с версии 4.0 и выше. Так что отойди!
 18 мая 2012 г., 04:31
Да, конечно, но это не вопрос.
 Evil Nodoer18 мая 2012 г., 08:00
Я хочу принять комментарий jfortmann. Это именно то, что я ищу.
 18 мая 2012 г., 04:42
Ах да, но конвертировать между ними довольно легко, так что это не совсем не по теме.
 18 мая 2012 г., 04:22
Намного безопаснее работать с CGImage, к вашему сведению.

Apple обновила свою документацию с тех пор, как здесь были опубликованы предыдущие ответы. Согласно самой современной документации, безопасно создавать и использовать экземпляры UIImage из любого потока:

Because image objects are immutable, you cannot change their properties after creation. Most image properties are set automatically using metadata in the accompanying image file or image data. The immutable nature of image objects also means that they are safe to create and use from any thread.

https://developer.apple.com/reference/uikit/uiimage

Ваш ответ на вопрос