- 浏览: 676787 次
- 性别:
- 来自: 深圳
最新评论
-
fingerplay:
请问一下,第一份,逻辑树,就是代码里可以操纵的,例如更改lay ...
UIView与CALayer -
ok_lyc:
分享到哪里去了
iPhoneUIFont各种字体 -
lliiqiang:
我的个人理解:wait方法是在java虚拟机层面上在获取对象锁 ...
JAVA多线程同步wait、notify、synchronized -
milixw:
谢谢分享,就在找这个
iphone 推送通知 java 实现 -
wsqwsq000:
你的log4j包不行,上网搜一下:log4j-1.2.16.j ...
iphone 推送通知 java 实现
引子:NSFetchedResultsController和UITableView集成起来处理数据具有强大的灵活性。首先得到的好处是不需要将数据记录进行分页,不然,按照传统的做法,需要先查询出总的记录,然后再从纪录里面过滤,这样会进行两次操作,对内存消耗很大,处理不好,程序甚至可能崩溃。使用NSFetchedResultsController类不仅简单,还具有更高的性能,这个类自动帮助你记录分页的事情,得到表对应的Core Data对象也非常简单。
更重要的是,你在其他界面更新或者删除记录时,NSFetchedResultsController可以帮助你同步更新UITableView,你的UITableView和数据库同步将变得非常简单。
NSFetchedResultsController
继承自 | |
遵循 | |
框架 |
/System/Library/Frameworks/CoreData.framework
|
可用性 |
Available in iOS 3.0 and later.
|
指南 | |
定义于 |
NSFetchedResultsController.h
|
相关代码 |
当你从Core Data 取出数据,然后以表格视图的形式展现数据的时候, fetched results控制器很有用。它是连接Core Data和表格视图的桥梁,首选的一种控制器。
我们知道表格视图有很多种形式, fetched results 控制器主要针对列表视图(如图1),这种视图是由很多section组成的,每个section又包含了很多row。你只需配置:entity是什么,如何排序(必须配置),预筛选项(可选)。NSFetchedResultsController就会自动帮你处理好每个section都应该显示哪些数据。
另外,NSFecthedResultsController还提供以下特性:
- 监控managed object context对象的改变,报告给delegate(可选).
- 缓冲数据,让性能有所提升,专门针对需要频繁显示的数据 (可选)。
总结一下,fetched results 控制器 提供下面3种模式:
1. 不追踪模式:delegate设为nil.
只提供基本的查询数据访问数据的能力。
2. 内存追踪模式:delegate有值,file cache name设为nil.
controller负责监控结果集中的数据改变,针对改变调整排序。
3. 完全追踪模式:delegate和file cache name都有值
controller负责监控结果集中的数据改变,针对改变调整排序。还能把计算的结果存入缓存。
重要:作为这个类的delegate,至少要实现一个追踪方法:controllerDidChangeController。哪怕这个方法你什么也不写为空,也要实现这个方法。
使用NSFetchedResultsController控制器
创建控制器
一般来说,你会创建一个NSFetchedResultsController实例作为table view的成员变量。初始化的时候,你提供四个参数:
1。 一个fetch request.必须包含一个sort descriptor用来给结果集排序。
2。 一个managed object context。 控制器用这个context来执行取数据的请求。
3。 一个可选的key path作为section name。控制器用key path来把结果集拆分成各个section。(传nil代表只有一个section)
4。 一个cache file的名字,用来缓冲数据,生成section和索引信息。
当你实例都创建好之后,调用performFetch: 来执行查询。
NSManagedObjectContext *context = <#Managed object context#>;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Configure the request's entity, and optionally its predicate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#Sort key#>" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:@"<#Cache name#>"];
[fetchRequest release];
NSError *error;
BOOL success = [controller performFetch:&error];
重要:你不可以用一个fetched results controller来执行几个查询,如果你非要这么做,那用deleteCacheWithName:把cache file先删除,不然会冲突.
控制器的代理
如果你为fetched results控制器设置了代理,代理会收到从它的managed object context中传来改变通知。delegate会处理context中任何会影响结果集或者section的变化,results也做相应的更新。控制器会告诉delegate结果集改变了什么或者section变化了哪些。你只要覆写几个方法来更新table view就行。
缓存
如果有必要,控制器会使用缓存来避免重复地构造section或者把section中的内容进行排序的工作。可以说,你程序一运行,这个缓存也跟着建立好了。
当你初始化一个NSFetchedResultsController实例的时候,你一般会确定好文件的名字。(如果你不定义名字,那控制器就不使用缓存)当你创建一个控制器,它会寻找一个已存在的缓存:
如果控制器找不到合适的缓存,它就计算section以及其内容的显示顺序。把结果信息写入硬盘。
如果它能找到一个同名缓存,会先检查缓存中的数据是否合法。控制器会参照当前entity的名字,entity版本信息,排序,缓存文件更改时间来判断这个缓存是否可用。
如果缓存和当前信息相兼容,控制器会复用之前存储的计算结果。
如果缓存和当前信息不兼容,控制器重新计算然后更新缓存。
一旦section和排序的信息改变了,那缓存一定会跟着改变。
所以你如果有多个fetched result控制器,配置得都不一样,那你最好用不用得缓存名字。
函数 deleteCacheWithName:可以直接删除一个缓存文件
实现table view datasource方法
你可以让控制器提供相应的信息,然后实现你datasource方法。
(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [[<#Fetched results controller#> sections] count];
}
- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[<#Fetched results controller#> sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = <#Get the cell#>;
NSManagedObject *managedObject = [<#Fetched results controller#> objectAtIndexPath:indexPath];
// Configure the cell with data from the managed object.
return cell;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[<#Fetched results controller#> sections] objectAtIndex:section];
return [sectionInfo name];
}
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return [<#Fetched results controller#> sectionIndexTitles];
}
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index{
return [<#Fetched results controller#> sectionForSectionIndexTitle:title atIndex:index];
}
响应变化
基本上,NSFetchedResultsController设计之初就是为了应对模型层的变化,负责告知其delegate结果变化了或者section的改变了。
如果你允许一个用户重新对表格进行排序,那你实现的delegate方法就必须把这个也考虑进来。
其实, managed object context收到processPendingChanges消息的时候,所作的变化才有所反应。因此,如果你对一个managed object的属性进行了更改,存储位置变化了,控制器的结果会跟着改变。但当前事件周期结束,记录的索引才跟着变化(processPendingChanges函数被调用)。比如,下面这段代码 就应该输出“same”:
NSFetchedResultsController *frc = <#A fetched results controller#>;
NSManagedObject *managedObject = <#A managed object in frc's fetchedObjects array#>;
NSIndexPath *beforeIndexPath = [frc indexPathForObject:managedObject];
[managedObject setSortKeyAttribute:
<#A new value that changes managedObject's position in frc's fetchedObjects array#>;
NSIndexPath *afterIndexPath = [frc indexPathForObject:managedObject];
if ([beforeIndexPath compare:afterIndexPath] == NSOrderedSame) {
NSLog(@"same");
}
改变查询请求
你不能只是简单地改变fetch request来试图改变查询结果,如果你想看到变化,你应该:
1。如果你用cache,删掉它(用deleteCacheWithName:函数)
不过一般来说,查询请求都改变了,你不太可能会用一个cache.
2。改变fetch request.
3。调用 performFetch:函数
对象的检查
如果一个managed object context 告诉fetched result 控制器 一个单独的对象是无效的,那控制器就认为这样地对象已经被删除了,并且发送适当的delegate消息。
有的时候可能所有的对象都是无效的(比如,当我们调用reset函数或者一个存储从持久化存储管理器中被删除的时候)NSFetchResultsController不会一个个对象去检验,也不会发送删除对象的通知。而是,你必须调用performFetch:去重置管理器并且重载table view当中的数据(reloadData)。
iOS 版本的问题
iOS 4.0以后,即使你重用一个cache,那管理器也不会报错,只是显示出错误的数据而已(这样可以削减程序启动时复杂的字符串比较,提高效率)。所以注意不要重复使用!
子类需要注意
如果你想自定义section的创建,索引的标题,那你可能会子类这个控制器。你可以覆写sectionIndexTitleForSectionName:方法。
如果你想section的名字不是大写字母开头,而是其他的,你可以覆写sectionIndexTitles。
如果你想索引的名字是其他的内容,为每个已知section覆写sectionIndexTitleForSectionName:。
发表评论
-
iphone开发如何后台播放音频
2012-12-25 14:38 1566<!--?xml version="1.0&q ... -
iPhone开发中使用AVAudioPlayer出现内存泄漏的解决办法
2012-12-25 11:53 3350最近在使用AVAudioPlayer播放音频时,发现 ... -
dispatch多线程
2012-10-31 20:45 1461#define kBgQueue dispat ... -
iPhone开发使用数组排序
2012-10-30 19:18 1793我们以数组的排序为例(也许NSSortDes ... -
用containsObject判断是否存在的问题
2012-10-16 15:37 4566在NSArray或NSMutableArray中想使用c ... -
用NSZombieEnabled解决恼人的EXC_BAD_ACCESS错误
2012-09-17 10:30 1382转载自:http://longtimenoc.com/a ... -
使用xib加载视图后,在dealloc中crash
2012-09-08 11:20 1771最近遇到个问题,就是使用xib加载视图后,经常会 ... -
iPhone中如何获取当前输入法
2012-09-06 16:28 1702如题,在iPhone开发中,我们如何获取当前的输入 ... -
objectForKey和valueForKey的区别
2012-08-24 17:23 2168valueforkey和objectforkey区别 ... -
粒子发射系统中的CAEmitterLayer
2012-08-22 16:00 2522简介:CAEmitterLayer提供了一个基于 ... -
iPhone开发使用UILineBreakMode不精确
2012-07-26 12:02 1554一开始用UILineBre ... -
Xcode方法提示不显示的解决办法
2012-07-24 09:45 1616Xcode方法提示显示的不正确,只显示方法 ... -
NSArray的排序功能sortedArrayUsingSelector
2012-07-18 17:54 2234- (NSArray *)sortedArrayUs ... -
iPhoneUIFont各种字体
2012-07-24 09:45 1569苹果开发者们想在应用中使用不同字体的话,往往会发现 ... -
iPhone使用ASIHTTPRequest请求时,发送了2次请求
2012-07-24 09:45 2559前段时间用到ASIHTTPRequest做请求时, ... -
iPhone开发调用新浪微博OAuth2.0
2012-06-05 02:30 3105就像题目说的,这次的小项目是做一个新浪微博的客 ... -
Iphone cover flow 开源实现
2012-06-04 00:04 891tapkulibrary-CloverFlow ... -
ASIHTTPRequest下载示例(支持断点续传)
2012-07-24 09:45 1599在工程中,我们会常常遇到需要下载的程序,比 ... -
ASIHTTPRequest类库简介和使用说明
2012-07-24 09:45 1698文章转载自:http: ... -
NSUserDefaults 用户偏好设定保存自定义类(序列化)
2012-04-17 23:30 0NSUserDefaults 用户偏好设定保存 ...
相关推荐
数据库实验.py
1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
学会学习心理课拒绝诱惑:自制力培养手册.docx
基于matlab+Simulink模拟的微电网系统包括包括电源、电力电子设备等+源码+开发文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: 这是一个完整的微电网模型,包括电源、电力电子设备、使用MatLab和Simulink的负载和电源模型。该模型基于费萨尔·穆罕默德的硕士论文《微网格建模与仿真》。 什么是微电网 模拟的微电网使用一组电源和负载在与任何集中式电网(宏电网)断开连接的情况下工作,并自主运行,为其局部区域提供电力。该仿真对微电网在稳态下进行建模,以分析其对输入变化的瞬态响应。 此模拟的目的 对系统进行全年模拟,测量负载、产量、电压和频率。 给出简化规划和资源评估阶段的方法。
Unity插件 Translucent Image 可帮助你构建精美的模糊背景 UI,例如在 iOS/MacOS/Windows 10 Fluent 设计中的 UI。 与许多其他背景模糊解决方案不同,Translucent Image 采用一种对性能影响最小的高效算法,因此用户可以享受更高的帧速率和更长的电池寿命。不仅如此,当你将模糊调高时,它还可以产生完美的平滑效果,而其它资源在高度模糊时会呈现难看的块状图像。
基于卷积神经网络的人脸识别卷积神经网络(Convolutional Neural Networks, CNNs 或 ConvNets)是一类深度神经网络,特别擅长处理图像相关的机器学习和深度学习任务。它们的名称来源于网络中使用了一种叫做卷积的数学运算。以下是卷积神经网络的一些关键组件和特性: 卷积层(Convolutional Layer): 卷积层是CNN的核心组件。它们通过一组可学习的滤波器(或称为卷积核、卷积器)在输入图像(或上一层的输出特征图)上滑动来工作。 滤波器和图像之间的卷积操作生成输出特征图,该特征图反映了滤波器所捕捉的局部图像特性(如边缘、角点等)。 通过使用多个滤波器,卷积层可以提取输入图像中的多种特征。 激活函数(Activation Function): 在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持特征的空间层次结构。 常见的池化操作包括最大池化(Max Pooling)和平均
基于java进行的软件测试实验代码.zip
【优化求解】遗传算法求解多城市多应急物流中心选址问题【含Matlab源码 1724期】.zip
结构型设计模式(7种)
课设毕设基于SpringBoot+Vue的旧物置换网站 LW+PPT+源码可运行.zip
健康菜谱App是一款专为追求健康饮食生活的用户设计的应用程序。它提供了一系列精心挑选的营养食谱,旨在帮助用户做出美味又健康的餐点。以下是健康菜谱App的核心特点: 丰富食谱库:包含数百种健康食谱,涵盖早餐、午餐、晚餐及小吃等。 营养信息标注:每道食谱都配有详细的营养信息,包括卡路里、蛋白质等。 个性化推荐:根据用户的饮食习惯和健康目标,智能推荐合适的菜谱。 食材替换建议:提供食材替换选项,帮助用户根据自己的口味和需求调整食谱。 一键购物清单:自动生成购物清单,方便用户购买所需食材。 步骤图解:每道食谱都配有清晰的步骤图解,即使是烹饪新手也能轻松上手。 社区分享功能:用户可以在社区中分享自己的烹饪成果,交流烹饪心得。 无广告干扰:提供无广告的用户体验,让用户专注于烹饪和享受美食。 健康菜谱App是健康饮食追求者的得力助手,无论是健身爱好者、素食主义者还是普通家庭,都能找到适合自己的健康食谱。立即下载健康菜谱App,开启健康饮食新篇章!
课设毕设基于SpringBoot+Vue的职称评审管理系统 LW+PPT+源码可运行.zip
MikelProjectDemo-dev
基于springboot的java毕业&课程设计
HUWEI eNSP课程作业
基于springboot的java毕业&课程设计
基于springboot的java毕业&课程设计
微信小程序设计之相关行业源码及图文导入教程
在 Unity 中创建一个简单的“贪吃蛇”游戏是一个很好的练习项目,可以帮助理解 Unity 的基本组件和工作流程。要在Unity中实现一个完整的2D贪吃蛇游戏,需要遵循一系列步骤来创建游戏场景、角色、食物、游戏逻辑和用户界面。
基于springboot的java毕业&课程设计