有时候,我们需要有个worker thread来做一些密集型或者长耗时的任务,以避免阻塞住UI,给用户不好的体验。比如从网络上获取一批数据,然后解析它们,并将其输出到存储文件中。这时候,由于数据层发生了变动,我们希望通知到主线程更新UI —— 这就涉及到Core Data的多线程特性。
比如我们一直以来使用的Demo中,添加球员信息的AddPlayerViewController和显示球员列表的PlayerListViewController在进行CURD操作时都是在主ViewController的context中完成的,这通过维持一个属性cdViewController指向主ViewController来实现:
- #pragma mark -
- #pragma mark - UITableView Delegate
- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
- {
- [tableView deselectRowAtIndexPath:indexPath animated:YES];
- Team *teamObject = [self.teamArray objectAtIndex:indexPath.row];
- PlayerListViewController *playerListVC = [[[PlayerListViewController alloc] init] autorelease];
- playerListVC.team = teamObject;
- playerListVC.cdViewController = self;
- [self.navigationController pushViewController:playerListVC animated:YES];
- }
- #pragma mark -
- #pragma mark - Player CURD
- - (void)addPlayer:(id)sender
- {
- AddPlayerViewController *addPlayerVC = [[[AddPlayerViewController alloc] init] autorelease];
- addPlayerVC.cdViewController = self.cdViewController;
- addPlayerVC.team = self.team;
- [self presentModalViewController:addPlayerVC animated:YES];
- }
对于比较小的Demo,这么写代码是可以接受的,虽然也会觉得传递得有点长。
当程序的代码规模比较大,或者说处理的数据比较多时,我们可以通过引入并发特性来做一点优化。
通过创建临时的context来添加球员信息:
- - (IBAction)addBtnDidClick:(id)sender
- {
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
- NSManagedObjectContext *tmpContext = [[NSManagedObjectContext alloc] init];
- [tmpContext setPersistentStoreCoordinator:sharedPersistentStoreCoordinator];
- // We don't check the user input.
- Player *playerObject = [NSEntityDescription insertNewObjectForEntityForName:@"Player" inManagedObjectContext:tmpContext];
- playerObject.name = self.nameTextField.text;
- playerObject.age = [NSNumber numberWithInteger:[self.ageTextField.text integerValue]];
- playerObject.team = self.team;
- NSError *error = NULL;
- if (tmpContext && [tmpContext hasChanges] && ![tmpContext save:&error]) {
- NSLog(@"Error %@, %@", error, [error localizedDescription]);
- abort();
- }
- dispatch_async(dispatch_get_main_queue(), ^{
- [self dismissModalViewControllerAnimated:YES];
- });
- });
- }
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mocDidSaveNotification:) name:NSManagedObjectContextDidSaveNotification object:nil];
- - (void)mocDidSaveNotification:(NSNotification *)notification
- {
- NSManagedObjectContext *savedContext = [notification object];
- if (savedContext == self.managedObjectContext) {
- return ;
- }
- if (savedContext.persistentStoreCoordinator != self.persistentStoreCoordinator) {
- return ;
- }
- dispatch_async(dispatch_get_main_queue(), ^{
- NSLog(@"Merge changes from other context.\n");
- [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
- });
- }
- 2013-01-21 09:56:08.300 cdNBA[573:617] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'team' between objects in different contexts
- addPlayerVC.teamID = [self.team objectID];
- // ...
- playerObject.team = (Team *)[tmpContext objectWithID:self.teamID];
- 2013-01-21 10:11:12.834 cdNBA[687:1b03] void _WebThreadLockFromAnyThread(bool), 0x83a91c0: Obtaining the web lock from a thread other than the main thread or the web thread. UIKit should not be called from a secondary thread.
- 2013-01-21 10:11:12.932 cdNBA[687:c07] Merge changes from other context.
第二行日志说明合并变化了,不过第一行告诉我们在非主线程里面访问了一些UI方面的东西。这是由于上面在global_queue里面访问了UITextField,把访问UI的代码提到外面即可。
BTW,在iOS 5以后,苹果提供了更为便捷有效的parent-child context机制,可以参见这里。
相关推荐
本书旨在为读者提供关于如何最大限度地利用Core Data框架的同时避免潜在陷阱的清晰指导。本书假设读者已经熟悉Swift语言及其iOS开发环境,但对于无论是初学者还是经验丰富的Core Data开发者来说,都将发现大量的实用...
本书《Core.Data.Updated.for.Swift.3》是关于学习使用Swift 3进行Core Data开发的指导书。Core Data是苹果公司提供的一个框架,用于管理应用程序数据模型对象的生命周期,它简化了数据持久化过程。在本书的介绍中,...
《Core Data by Tutorials v4.0》是关于苹果开发框架Core Data的一份详细教程,主要针对Swift 4编程语言。Core Data是苹果提供的一种数据管理框架,它为iOS、macOS、watchOS和tvOS应用程序提供了模型层的抽象和管理...
《Core Data by Tutorials v4.0 (Swift 4)》是针对苹果开发平台的一款深入讲解Core Data技术的教程,特别适用于使用Swift 4编程语言的开发者。Core Data是Apple提供的一项强大的数据管理框架,它简化了应用程序的...
"Data Analytics with Hadoop: An Introduction for Data Scientists" ISBN: 1491913703 | 2016 | PDF | 288 pages | 7 MB Ready to use statistical and machine-learning techniques across large data sets? ...
本书《Pro Core Data for iOS》以完全更新的形式针对Xcode 4.2版本,涵盖了iOS SDK 5环境下Core Data框架的使用方法。Core Data是苹果公司推出的数据存储和检索技术,它对于开发者来说易于上手,但深入掌握却颇具...
- **Core Data与并发**:探讨了如何在多线程环境中使用Core Data。 - **Core Data堆栈**:介绍了不同场景下如何配置不同的Core Data堆栈。 - **多上下文的问题**:讨论了在使用多个上下文时可能出现的一些常见问题,...
### ABAP Core Data Services (CDS):SAP最新技术详解 #### 一、引言 随着企业数据处理需求的不断增长以及业务复杂性的提升,SAP推出了一种全新的技术——ABAP Core Data Services(简称CDS),旨在帮助开发者更...
5. **性能优化技巧**:提供了一系列提高Core Data性能的方法,包括缓存策略、批量操作等。 6. **高级主题**:包括错误处理、版本控制、实时同步等高级特性。 7. **实战案例分析**:通过具体的项目案例来展示如何在...
总之,《Core Data》这本书全面覆盖了从基础到高级的Core Data使用技巧,适合不同层次的iOS开发者阅读,无论你是初学者还是经验丰富的专业人士,都能从中获益匪浅。通过系统的学习和实践,你将能够更好地利用Core ...
6. **多线程和并发处理**:介绍如何在多线程环境中安全地使用Core Data,避免数据冲突和错误。 7. **故障恢复与调试**:讨论故障恢复机制和调试技巧,确保应用程序能够在遇到问题时及时恢复并找出原因。 #### 四、...
《Core Data by Tutorials》是一本专注于教授iOS开发者如何使用苹果公司的Core Data框架的教程书籍,它详尽地介绍了从基础到高级的Core Data技能。这本书特别为iOS 8和Xcode环境编写,提供了系统性地从零开始构建...
Core Data is intricate, powerful, and necessary. Discover the powerful capabilities integrated into Core Data, and how to use Core Data in your iOS and OS X projects. All examples are current for OS X...
Core Data是苹果开发框架中的一个重要组成部分,主要用于管理应用程序的数据模型。这个“Core Data 示例源码 操作xml归档”是一个示例项目,旨在演示如何在OS X平台上利用Core Data框架来处理XML档案。通过这个教程...
- **全面覆盖**:不仅涵盖了Core Data的基础知识,还包括了许多高级特性,如并发处理和数据同步。 - **与时俱进**:尽管本书最初出版于iOS 4时代,但其中的概念和技巧仍然适用于当前的iOS开发环境。 #### 四、总结 ...
《iOS Core Data高级编程 第二版》是针对iOS开发者在数据持久化领域的一本专业书籍,专门讲解了如何高效使用Core Data框架。这本书涵盖了Core Data的基础知识、高级概念以及实用技巧,适合有一定iOS开发经验,并希望...
4. **Core Data堆栈(The Core Data Stack)**:Core Data堆栈是指一系列协同工作的对象,它们共同完成了数据的存储和检索。这包括托管对象模型(Managed Object Model)、持久化存储(Persistent Store)和持久化...
总之,《Core Data by Tutorials v6》教程是iOS开发者深入学习Core Data的宝贵资源,无论你是初学者还是经验丰富的开发者,都能从中获益匪浅。通过这本书,你可以掌握从数据模型设计到实际应用开发的完整流程,提升...