Рассмотрим следующий пример:
@implementation AppDelegate
{
UIDeviceOrientation _orientation;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIDevice *device = [UIDevice currentDevice];
_orientation = device.orientation;
[[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceOrientationDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
// setting _orientation happens on the main thread
_orientation = device.orientation;
}];
return YES;
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
// accessing _orientation on a background queue
[self _doStuffWithBuffer:sampleBuffer orientation:_orientation];
}
@end
В фоновую очередь поступают буферы камеры. Для их обработки мне нужен доступ к текущей ориентации устройства. Однако для получения этого требуется доступ из главной очереди.
В подобных примерах это нормально, если основная очередь иногда записывает простые значения, а фоновая очередь их читает? Я мог бы обернуть все операции чтения и записи в os_unfair_lock, но я надеюсь избежать удачного попадания в блокировку в случае чтения, что часто случается.
Если этот пример в порядке, то в каких случаях он не в порядке? Я предполагаю, что чтение / запись объектов не нужны; что насчет структур?