Это решение работает
Обратите внимание, что это решение работает только при первом обращении к myController в фоновом потоке.Он будет заблокирован при вызове в главном потоке.
Вы хотите использовать gcd.Ключ заключается в сериализации создания объекта, так что независимо от потоков, запускающих блок, он всегда будет создаваться только один раз.
- (UIViewController *)myController
if (_myController == nil) {
dispatch_sync(dispatch_get_main_queue(), ^ { if (_myController == nil) _myController = [[MyViewController alloc] init]; });
}
return _myController;
}
Здесь, даже если несколько потоков исполняют блок, выполнениеблока сериализуется в основной поток, и только один MyViewController может быть создан.
Вы не увидите здесь снижения производительности, если объект не равен nil.
Поскольку свойство неявно атомарно, это означает, что в установщике значение будет автоматически освобождено.Это должно сделать его подходящим для смешивания с вашим пользовательским получением, поскольку оно автоматически высвобождает любые изменения значения _myController.
http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW2
Однако вы все равно можете попасть в состояние гонки, в котором вы находитесьустановка значения в одном потоке, но доступ к нему в другом.Каждый раз, когда вы устанавливаете значение, вы, вероятно, захотите убедиться и сделать что-то вроде этого:
dispatch_sync (dispatch_get_main_queue (), ^ {self.myController = {newValueOrNil}});
Thisубедитесь, что сериализованы вызовы методов сеттера, без необходимости заново изобретать колесо для атомарных сеттеров, что очень трудно понять.
Это решение не работает
Вы хотите использовать gcd.
http://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html#//apple_ref/c/func/dispatch_once
Смотрите этот пост о синглетонах.Я знаю, что вам не нужен синглтон, но это демонстрирует, как использовать метод.Вы можете легко адаптировать его.
Создать синглтон, используя dispatch_once из GCD в Objective C