2012-06-30 5 views
3

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

[backgroundThread performBlock:^{ 
    //do something with MyObject that might take some time 
}]; 

[self dismissModalViewController]; //this releases all instance variables, right? 

Так что же происходит у меня есть NSManagedObjectContext называется backgroundThread, что делает некоторую работу на объекте в фоновом режиме. Это немедленно возвращается и выполняет работу в фоновом режиме, а затем вызывается dismissModalViewController, который освобождает все переменные экземпляра. Итак, что, если модальное представление теперь отклонено, но backgroundThread все еще должен использовать объект? Это проблема? Каков обходной путь?

И еще одно: этот объект MyObject вставляется в контекстный контекст backgroundThread. Означает ли это, что этот NSManagedObjectContext сохранит объект, даже после отклонения представления?

Я использую ARC.

+0

Если вы заблокировали мьютекс, вам не придется беспокоиться об этом. – CodaFi

+0

Что такое блокировка мьютекса? – Snowman

+0

Блокировка мьютекса гарантирует, что в то время как MyObject обрабатывается в фоновом режиме, ни одна другая нить не может его коснуться, в том числе освободить его. – CodaFi

ответ

5

Есть несколько вещей, о которых вам нужно подумать. Прежде всего имейте в виду, что блок будет захватывать все, что он имеет в виду. Поэтому вам может не понадобиться ничего особенного, и ваш код будет работать нормально, в зависимости от того, что вы делаете в своем блоке. Правила захвата блоков описаны в документации Apple Block Programming Topics и о том, как обрабатывается каждая переменная, зависит от ее типа. В частности,

В среде с подсчетом ссылок вручную локальные переменные, используемые в блоке, сохраняются при копировании блока. Использование переменных экземпляра в блоке приведет к тому, что сам объект будет сохранен. Если вы хотите переопределить это поведение для определенной переменной объекта, вы можете пометить его модификатором типа __block.

Если вы используете ARC, переменные объекта сохраняются и освобождаются автоматически при копировании блока и последующем выпуске.

Другое дело, что доступ к переменным экземпляра может быть или не быть потокобезопасным. Доступ к переменным экземпляра через свойства, объявленные как atomic, является шагом в правильном направлении, но для синхронизации доступа в зависимости от специфики ситуации вам может потребоваться использование блокировок или других методов блокировки доступа.

+0

Обратите внимание, что доступ к атомам SLOW. – CodaFi

+0

Объявление свойств как «атомных» на самом деле очень редко является шагом в правильном направлении. Создание свойства 'atom', само по себе, не делает переменную потокобезопасной в большинстве параллельных сценариев доступа. Вам по-прежнему необходимо обеспечить защиту, например, с помощью блокировки мьютекса. Как только вы предоставите блокировку мьютекса, вам обычно не нужно, чтобы свойство было «атомарным», и, как сказал CodaFi, он медленнее. [Вот еще одно обсуждение этой конкретной проблемы - atomic] (http://stackoverflow.com/questions/588866/atomic-vs-nonatomic-properties) – Nate

+0

Где я могу узнать больше о специфике того, является ли переменная экземпляра потокобезопасной или нет? Я использую ARC .. – Snowman

1

Если вы хотите ссылаться на иварцы или другие свойства вашего (модального) контроллера просмотра, вам необходимо убедиться, что контроллер модального представления все еще существует.

Вот потенциально полезный намек Apple's documentation on dismissModalViewControllerAnimated::

Если вы хотите сохранить ссылку на представленном контроллер вида приемника, получить значение свойства modalViewController перед тем вызова этого метода.

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

+0

Подождите, я не понимаю, что вы подразумеваете под своим последним пунктом ... кто будет владеть этим отдельным объектом? – Snowman

+0

Я изменил свой ответ с помощью некоторой другой информации, которую я обнаружил (чтобы использовать свойство «modalViewController'» контроллера представления), но если вы сделали это и использовали отдельный объект, как контроллер представления, так и ваш фоновый поток могли иметь ссылки (что должно быть хорошо в ARC или вне ARC). –

+0

Вы знакомы с Core Data? Проверьте мое редактирование..MyObject был вставлен в NSManagedObjectContext .. это означает, что контекст сохранит объект даже после отклонения представления? – Snowman

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