大佬教程收集整理的这篇文章主要介绍了ios – 多个NSManagedObjectContexts或单个上下文和-performBlock,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我的问题是:是performBlock,唯一的是为该上下文执行代码?我们不能做如下的事情:
- (void) checkSyncServer { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0),^{ //do something here,check and fetch data // create NsmanagedObject's [_tempContext save:&error]; //masterContext will merge changes through notification observers }); }
(即)执行除了-performBlock方法之外的代码.如何执行多个异步方法并执行保存?
>在线程/队列.这适用于限制的上下文和主队列上下文.您可以从自己的线程自由访问它们.
>使用-performBlock:如果它是一个私有队列上下文,或者你是从一个线程而不是它所属的线程触摸上下文.
您不能使用dispatch_async访问上下文.如果您希望该操作是异步的,则需要使用-performBlock:.
如果您之前使用单个上下文,并且您正在使用dispatch_async触摸它,则会违反线程限制规则.
更新
当您调用功能上等同于[[NsmanagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType]的[[NsmanagedObjectContext alloc] init]时.
NsmanagedObjectContext一直被线程限制.
NsmanagedObjectContext *moc = ...; [moc performBlock:^{ //Fetch something //Process data //Save }];
或者你可以嵌套它们,如果你希望他们彼此不同步:
NsmanagedObjectContext *moc = ...; [moc performBlock:^{ //Fetch Something [moc performBlock:^{ //Process Data }]; [moc performBlock:^{ //Save }]; }];
由于–performBlock:进入安全的你可以嵌套他们所有你想要的.
更新异步保存
> UI会话的主队列上下文
>保存的私有队列上下文
私有上下文具有NSPersistentStoreCoordinator,主队列上下文的私有作为其父对象.
所有工作都在主队列上下文中完成,您可以安全地保存,通常在主线程上.那个保存将是瞬间的.之后,你做一个异步保存:
NsmanagedObjectContext *privateMOC = ...; NsmanagedObjectContext *mainMOC = ...; //Do something on the mainMOC NSError *error = nil; if (![mainMOC save:&error]) { NSLog(@"Main MOC save Failed: %@\n%@",[error localizedDescription],[error userInfo]); abort(); } [privateMOC performBlock:^{ NSError *error = nil; if (![privateMOC save:&error]) { NSLog(@"Private moc Failed to write to disk: %@\n%@",[error userInfo]); abort(); } }];
>创建您的私人moc
>将其设置为主要的父级
>更改你的main的init
>当您在主电话上保存时,添加私有块保存方法
你可以从那里重构,但这是你真正需要改变的.
以上是大佬教程为你收集整理的ios – 多个NSManagedObjectContexts或单个上下文和-performBlock全部内容,希望文章能够帮你解决ios – 多个NSManagedObjectContexts或单个上下文和-performBlock所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。