С основными данными есть постоянный танец вокруг проблем безопасности нитей. Выполнение выборок на одном NSManagedObjectContext
в двух разных потоках гарантирует тупик. Руководство Apple по программированию ядра предлагает использовать ограничение потока, но не предоставляет шаблон, с помощью которого вы можете выполнить это. У меня есть быстрый и грязный раствор ниже:NSManagedObjectContext: Является ли это хорошим шаблоном ограничения потока?
- (NSManagedObjectContext *) managedObjectContext
{
NSManagedObjectContext *moc = objc_getAssociatedObject([NSThread currentThread], _cmd);
if (!moc && self.persistentStoreCoordinator)
{
moc = [[NSManagedObjectContext alloc] init];
moc.mergePolicy = NSOverwriteMergePolicy;
moc.persistentStoreCoordinator = self.persistentStoreCoordinator;
objc_setAssociatedObject([NSThread currentThread], _cmd, moc, OBJC_ASSOCIATION_RETAIN);
}
return moc;
}
Этот метод будет отображаться в собственном классе, который управляет стек данных в моем приложении. Он связывает MOC с текущей нитью. Это кажется правдоподобным решением для меня, но оно также кажется быстрым и свободным.
Что я должен беспокоиться о попытке решения такого рода?
Посмотрите на [Grand Central Dispatach] (http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html). Я нахожу его более чистым, чем непосредственное взаимодействие с потоками, и у меня были успешные завершающие вызовы на мой MOC в отдельной очереди отправки. Основываясь на том, что вы показали, я не думаю, что необходимо использовать такие функции времени исполнения. –
Также, кстати, у NSThread синглетонов есть 'threadDictionary', которые вы можете использовать для связывания объектов с потоком. Это безопаснее, чем возиться с функциями времени выполнения :) –