我想使用单例UIApplication来访问AppDelegate的managedObjectContext.但是当我写作
[[[UIApplication sharedApplication] delegate] managedObjectContext]
Run Code Online (Sandbox Code Playgroud)
要么
[[[UIApplication sharedApplication] delegate] __managedObjectContext]
Run Code Online (Sandbox Code Playgroud)
它不起作用.
但这条线很好用:
NSLog(@"Seeking for the AppDelegate : %@", [[[UIApplication sharedApplication] delegate] class]);
Run Code Online (Sandbox Code Playgroud)
你有解决方案吗 ?尼尔斯
iphone singleton nsmanagedobjectcontext application-singleton ios
我运行我的应用程序,然后获取我的数据.数据还可以.当我第二次跑步时,我的旧价值出现了问题.怎么了?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Test" inManagedObjectContext:[self managedObjectContext]];
for (int i =0; i<2; i++)
{
Test *test = [[[Test alloc] initWithEntity:entity insertIntoManagedObjectContext:[self managedObjectContext]] autorelease];
test.text = @"Text";
test.index = [NSNumber numberWithInt:i];
}
[self saveContext];
}
-(void) showValues
{
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Test" inManagedObjectContext:[self managedObjectContext]];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entity];
NSError *error;
NSArray *array = [[self managedObjectContext] executeFetchRequest:request error:&error];
NSLog(@"Array: %@ ", array);
}
Run Code Online (Sandbox Code Playgroud)
第一次运行
2012-01-22 21:48:52.092 Mew[411:707] Array: ( …Run Code Online (Sandbox Code Playgroud) 我NSManagedObjectContext有一套NSPrivateQueueConcurrencyType我在应用程序中大部分时间都在使用的设置.
除此之外,我创建了一个NSMainQueueConcurrencyType与可可绑定一起使用的子MOC (我听说绑定不适用于私有队列MOC).我已经绑定了一些ObjectControllers和一个ArrayController这个子环境.我非常希望将子进程保留在主队列中,而不是交换MOC队列类型.
当我通过UI更改绑定对象时,更改不会传播到父上下文.当我对父上下文进行更改时,它们不会过滤到Object/ArrayControllers.
我怎样才能做到这一点?是否有一个设置可以告诉Object/ArrayControllers适当地刷新它们的上下文并在它们进行更改时保存它?
cocoa core-data objective-c cocoa-bindings nsmanagedobjectcontext
当有更大的工作要优化性能时,我正在尝试分离我的应用程序工作.我的问题是NSManagedObjectContext在另一个线程中使用而不是主线程.
我打电话给:
[NSThread detachNewThreadSelector:@selector(test:) toTarget:self withObject:myObject];
Run Code Online (Sandbox Code Playgroud)
在test方法上有一些事情要做,我有一个问题:
NSArray *fetchResults = [moc
executeFetchRequest:request
error:&error];
Run Code Online (Sandbox Code Playgroud)
这是我的test方法:
-(void) test:(MyObject *)myObject{
@autoreleasepool {
//Mycode
}
}
Run Code Online (Sandbox Code Playgroud)
在第二时间我所说的test方法中,当我的新线程被阻塞executeFetchRequest时调用.当我的test方法被连续多次调用时,这个问题就出现了.我认为问题来自moc但我不能理解为什么.
编辑:
用@ Charlie的方法它几乎可以工作.这是我保存我的代码NSManagedObjectContext(在我的新线程上创建的对象).
- (void) saveContext:(NSManagedObjectContext *) moc{
NSError *error = nil;
if ([moc hasChanges] && ![moc save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
}
Run Code Online (Sandbox Code Playgroud)
在新线程上调用此方法.我现在的问题是,通过这次保存,我遇到了僵局,我真的不明白为什么.没有它完美的工作.
EDIT2
我正在研究这个问题,但我还是无法修复它.我改变了我的代码detachNewThreadSelector.这是我的新代码:
NSManagedObjectContext* context = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType]; …Run Code Online (Sandbox Code Playgroud) 我对在后台队列上运行 CoreData 代码有一些困惑。
我们可以使用一些方法使用 NSManagedObjectContext 在后台线程上执行 CoreData 代码。
viewContext.perform { /*some code will run on the background thread*/ }
viewContext.performAndWait{ /*some code will run on the background thread*/ }
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么我应该使用这些函数而不是使用普通方式使用 DispatchQueue 在后台线程上运行一些代码
DispatchQueue.global(qos: .background).async {
/*some code will run on the background thread*/
}
Run Code Online (Sandbox Code Playgroud) 我需要一些帮助来使用Core Data with GCD中的对象; 我似乎得到NSManagedObjects,即使我访问他们的属性,也没有出现在主线程中.会感激一些帮助.
这就是我正在做的事情:在启动时,我需要从Core Data DB加载一个Person列表,在后台进行一些自定义处理,然后重新加载表以显示名称.我通过仅将objectID传递到GCD队列来遵循Core Data多线程的指导原则.但是当我在主线程上重新加载tableview时,我从未看到为联系人显示的名称(或其他属性),并且仔细观察,NSManagedObjects结果是主线程上的错误,即使我访问了各种属性的cellForRowAtIndexPath.当我NSLog时,name属性在后台线程中可见; 它也在cellForRowAtIndexPath中的NSLogs主线程上正确显示.但无论我做什么,它们都不会在tableView中显示.我尝试使用点表示法访问name属性,以及valueForKey,但都没有工作.
这是我的代码...... 它是从FRC初始化程序调用的:
- (NSFetchedResultsController *)fetchedResultsController
{
if (__fetchedResultsController != nil)
{
return __fetchedResultsController;
}
__fetchedResultsController = [self newFetchedResultsControllerWithSearch:nil]; // creates a new FRC
[self filterAllContactsIntoDictionary: __fetchedResultsController];
return [[__fetchedResultsController retain] autorelease];
}
- (void) filterAllContactsIntoDictionary: (NSFetchedResultsController *) frc
{
NSArray *fetchedIDs = [[frc fetchedObjects] valueForKey:@"objectID"];
NSArray *fetched = [frc fetchedObjects];
if (filterMainQueue == nil) {
filterMainQueue = dispatch_queue_create("com.queue.FilterMainQueue", NULL);
}
dispatch_async(self.filterMainQueue, ^{
NSManagedObjectContext *backgroundContext = [[[NSManagedObjectContext alloc] init] autorelease];
[backgroundContext setPersistentStoreCoordinator:[[self.fetchedResultsController …Run Code Online (Sandbox Code Playgroud) core-data grand-central-dispatch nsmanagedobject nsmanagedobjectcontext ios
我在我的应用程序中处理数据导入部分,为了使UI更可靠,我按照Marcus Zarra的文章 http://www.cimgf.com/2011/08/22/importing-and-displaying-large -data集合核-数据/
我们的想法是你在后台的单独上下文中导入(我使用GCD),你的fetchedResultsController的上下文通过观察NSManagedObjectContextDidSaveNotification来合并更改.
我得到的问题对我来说很奇怪 - 我的fetchedResultsController没有获得那些更改,并且在新数据到来时不会重新加载TableView.但是,如果我触发以下方法,这使得获取和重新加载表 - 它在那里得到它.
- (void)updateUI
{
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
[self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)
所以现在我调用那个方法,当我得到NSManagedObjectContextDidSaveNotification使它工作,但它看起来很奇怪和讨厌我.
- (void)contextChanged:(NSNotification*)notification
{
if ([notification object] == [self managedObjectContext]) return;
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(contextChanged:) withObject:notification waitUntilDone:NO];
return;
}
[[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];
//TODO:Make it work as it should - merge, without updateUI
[self updateUI];//!!!Want to get rid of this!
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?以下是负责解析数据和添加Observer的代码.
- (void)parseWordsFromServer:(NSNotification …Run Code Online (Sandbox Code Playgroud) core-data objective-c nsfetchedresultscontroller nsmanagedobjectcontext ios
我有核心数据嵌套上下文设置.UI的主队列上下文并保存到SQLite持久性存储.用于与Web服务同步数据的专用队列上下文.
我的问题是同步过程可能需要很长时间,并且有可能在主队列上下文中删除同步对象.保存专用队列时,它将因"核心数据无法解决故障"异常而崩溃.
您对如何检查此问题或配置上下文以处理此案例的方式有任何建议吗?
我对coredata中的多线程有一个疑问.如果我们使用多线程,我们应该使用单独的NSManagedObjectContext来插入新数据或更新,否则我们可以使用父子上下文方法.但我只创建新的NSManagedObjectContext.我的问题是,我是否应该使用单独的NSManagedObjectContext甚至在后台线程中获取.如果不是(即我们只能使用主队列NSManagedObjectContext),那么为什么我得到__psynch_mutexwait错误.
谢谢,
我已经阅读了大量关于后台核心数据流程的博客,但我并没有更接近理解如何最好地管理许多BG核心数据任务,同时解雇并在未定义的时间通知主线程MOC.
我知道你应该有1 NSManagedObjectContext个NSThread和那个通过订阅NSManagedObjectContextDidSaveNotification和使用[context performBlock我得到一些很好的异步任务完成.
也就是说,我正在异步运行很多任务,我不会100%知道什么时候会重叠,而且我已经观察到......的竞争条件......
我的整体问题是如何解决多个MOC中的竞争条件?
如果正确的行为是每个线程有1个MOC ..我可以创建一个NSThread ivar并将我的所有Core Data工作到它上面吗?那样我可以让一个MOC与自己同步工作吗?
我读过一个NSLock可能是避免某些代码同时从多个线程访问的解决方案..但我不知道我应该锁定什么?保存上下文方法?持久存储(似乎使多线程毫无意义)?
最后,我可以标记/编号/命名我的MOC吗?这样,如果我知道其他任务正在运行,我可以存储通知并按照它们实例化的顺序处理它们,以确保没有数据被覆盖?
concurrency multithreading core-data nsmanagedobjectcontext ios
core-data ×8
ios ×7
objective-c ×3
cocoa ×2
concurrency ×1
iphone ×1
parent-child ×1
singleton ×1
swift ×1
xcode ×1