iOS - одновременный доступ к ресурсам памяти

Мое приложение загружает несколько ресурсов с сервера, данные и дескрипторы данных. Эти загрузки, инициируемые действиями пользователя, могут выполняться одновременно, скажем, до 50 загрузок одновременно. Все эти асинхронные задачи заканчиваются созданием объектов в памяти (например, добавление листьев к структурам данных, например добавление ключей в изменяемые словари или объектов в массивы). Мой вопрос: может ли это вызвать проблемы со стабильностью? Например, если несколько одновременных задач пытаются добавить ключи в один и тот же словарь, должен ли я справиться с ситуацией, установив какие-то блокировки? Если я реализую цикл for, который ищет графические элементы в массиве, возможно ли, чтобы другие выполняющиеся задачи могли изменить содержимое массива "в течение" цикла? Какая-нибудь ссылка или основная, общая ориентация по этим вопросам многозадачности, многопоточности, кроме официальной документации?

2 ответа

Решение

Зависит от того, как вы справляетесь с загрузками - если вы используете NSURLConnection, он обрабатывает отдельную многопоточность / параллелизм для вас, и ваш код реентерабелен, поэтому вам не нужно беспокоиться об одновременных действиях. Если вы создаете свои собственные темы, у вас могут возникнуть проблемы.

РЕДАКТИРОВАТЬ: Ваш код выполняется в главном потоке (основной цикл выполнения), скажем, у вас есть NSURLConnection, который также работает, то он будет выполняться в отдельном потоке. Однако ваш код делегата, который имеет дело с событиями, происходящими во время выполнения соединения, выполняется в цикле выполнения, а не в другом потоке. Это означает, что ваш код может выполнять только одну вещь за раз. Метод успешного подключения не будет вызываться одновременно с любым другим вашим кодом. Если у вас был запущен цикл for, он блокировал бы ваш основной поток до тех пор, пока он не завершил цикл, в то же время, если соединение завершилось, пока цикл for все еще выполняется, ваш код делегата не будет выполняться до тех пор, пока цикл не завершится.

Возможно, вы захотите взглянуть на Grand Central Dispatch (GCD) и барьерные блоки. Блокирующие барьеры позволят вам делать то, что вы хотите, в фоновом режиме и "блокировать" ресурсы.

Ознакомьтесь с документацией Apple и сообщением в блоге Майка Эша здесь, на GCD.

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

Удачи

Тим

Другие вопросы по тегам