Я создаю многопоточное приложение, из которого более одного потока могут записывать в базу данных sqlite3, включая основной поток. Я объявил статическую общедоступную переменную, которая будет использоваться для мьютекса:
@implementation Application
#pragma mark -
#pragma mark Static Initializer
static NSString * SubmitChangesLock = nil;
+ (void)initialize {
[super initialize];
SubmitChangesLock = [[NSString alloc] initWithString:@"Submit-Changes-Lock"];
}
+ (NSString *)submitChangesLock {
return SubmitChangesLock;
}
@end
и внутри каждого метода, который должен записывать в базу данных, я использую эту переменную с директивой @synchronized, чтобы заблокировать раздел, который записывает в базу данных.
- (void)method1FromClass1 {
@synchronized ([Application submitChangesLock]) {
// write to the database here...
}
}
- (void)method2FromClass2 {
@synchronized ([Application submitChangesLock]) {
// write to the database here...
}
}
и все работало нормально, но иногда, когда какой-либо из этих методов вызывается из основного потока, он зависает в ожидании повторной разблокировки мьютекса, но этого не произошло, и проблема в том, что это происходит только при некоторых вызовах из основного потока и кода запись в базу данных определенно конечна, поэтому я не мог определить, почему основной поток продолжает ждать разблокировки мьютекса и почему он не разблокируется в первую очередь.
Примечание: ни один из других потоков не был заблокирован этим мьютексом, только основной.
РЕДАКТИРОВАТЬ: я попытался заменить директиву @synchronized с помощью PerformSelectorOnMainThread:waitUntilDone:
- (void)writeToDatabase {
// write to the database here...
}
- (void)method2FromClass2 {
[self performSelectorOnMainThread:@selector(writeToDatabase) withObject:nil waitUntilDone:YES];
}
и он работает нормально, но я пытаюсь избежать такой большой нагрузки на основной поток, чтобы не блокировать взаимодействие с пользователем.
Любая помощь будет принята с благодарностью, и большое спасибо заранее.
NSOperation
/NSOperationQueue
)? - person paulbailey   schedule 04.01.2012static NSString * SubmitChangesLock = @"Submit-Changes-Lock";
вместо того, чтобы поиграться с методом инициализации? - person deanWombourne   schedule 04.01.2012NSOperationQueue
с maxConcurrency, установленным на 1, и на то, чтобы архитектура вашего приложения работала асинхронно. - person deanWombourne   schedule 04.01.2012