Пример использования потока

Допустим мы хотим использовать  AddressBookRef во всем приложении, при этом, чтобы не было одновременного доступа из разных потоков.

Я бы создал отдельный класс, который работает с AddressBook и только он имеет на него ссылку. Все остальные классы к нему обращаются и эти обращения синхронизируются так, что только одно обращение выполняется в любой момент времени. Для этого придется  создать serial queue и складывать в него запросы на чтение/запись.

Мы создаем один раз address book и serial queue. Когда надо с ней выполнить операцию, то клиент должен передать блок, который в качестве параметра получит AddressBookRef. Соответственно, все такие блоки построятся в очередь и serial queue будет их выполнять по очереди, следовательно, нет одновременного доступа к address book из нескольких потоков.

Это можно реализовать так:

Создадим класс — Book.
Book.h

#import <Foundation/Foundation.h>
#import <AddressBook/AddressBook.h>

typedef void (^BBOperation)(ABAddressBookRef);

@interface BBBook : NSObject
- (void)doWithAddressBook:(BBOperation)op;

@end

Book.m

#import "BBBook.h"
#import <dispatch/queue.h>


@implementation BBBook {
@private
	ABAddressBookRef _abRef;
	dispatch_queue_t _queue;
}

- (id)init {
	if ((self = [super init])) {
		if (ABAddressBookCreateWithOptions != NULL) {
			CFErrorRef *error = nil;
			_abRef = ABAddressBookCreateWithOptions(NULL, error);
		} else {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated"
			_abRef = ABAddressBookCreate();
#pragma GCC diagnostic pop
		}
		_queue = dispatch_queue_create("com.bb.sync", NULL);
	}
	return self;
}

- (void)dealloc {
    if (_abRef) {
       CFRelease(_abRef);
    }
	dispatch_release(_queue);
}

- (void)doWithAddressBook:(BBOperation)op {
	dispatch_sync(_queue, ^{
		op(_abRef);
	});
}

@end

Использовать можно так:

- (void)test {
	__block int pc = 0;
	Book *bb = [[Book alloc] init];
	[bb doWithAddressBook:^(ABAddressBookRef abRef) {
		pc = ABAddressBookGetPersonCount(abRef);
	}];
	NSLog(@"persons count: %i", pc);
}

Примечание: проект с ARC.

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий