帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:IMP  Swift  Realm  Implementation  Nsfetchedresultscontrolle  
A NSFetchedResultsController implementation for Realm written in Swift

  • 源代码名称:RealmResultsController
  • 源代码网址:http://www.github.com/polqf/RealmResultsController
  • RealmResultsController源代码文档
  • RealmResultsController源代码下载
  • Git URL:
    git://www.github.com/polqf/RealmResultsController.git
  • Git Clone代码到本地:
    git clone http://www.github.com/polqf/RealmResultsController
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/polqf/RealmResultsController
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • Build Status

    用Swift编写的领域的NSFetchedResultsController实现

    ###Quick 启动:

    创建一个 RealmRequest:

    RealmRequest<T> 需要 3个参数:

    • 谓词
    • 领域数据库
    • 排序描述符

    其中 TRealm 模型

    let realm =// Your realm DBlet predicate =NSPredicate(format: "id!= 0")let sortDescriptors = [SortDescriptor(property: "projectID"), SortDescriptor(property: "name")]let request = RealmRequest<TaskModel>(predicate: predicate, realm: realm, sortDescriptors: sortDescriptors)
    创建 RealmResultsController

    RealmResultsController<T, U> 需要 4个参数:

    • RealmRequest<T>
    • 截面键路径( 可选)
    • 映射器像 func mapper(obj: T) -> U ( 可选)
    • 过滤器像 func filter(obj: T) -> Bool ( 可选)

    其中 TRealm 模型,U 是你要从RRC接收的对象的类型。 我们不能使用任何领域的镜像副本,或者我们将对象镜像到其他类型的"实体"中,所以我们不能在后台工作。

    每个RRC上的操作都被排队,以避免无序调用 willChangeResultsdidChangeResults。 每个RRC有自己的队列。

    注意:TU 可以是相同类型的,RRC将返回 T 对象的副本,但是不包含在任何领域。

    如果已经有一个 NSPredicate 来过滤结果,那么RRC会接受过滤函数? 很简单:

    • NSPredicate只允许你按领域属性进行筛选,而且非常有限。
    • 使用这个额外的筛选块,可以有更多的粒子结果,过滤使用关系的值或者取决于模型内部方法。
    • 这是对领域中NSPredicate有限功能的一种解决方法:)
    • 它不是强制的,默认情况下过滤器关闭是零。

    否则会引发异常。

    将sectionKeyPath限制为当前对象的一个属性

    // In this example we ask for TaskModel objects in Realm,// and we want it to map the results to a Task entity,// this entity defines it's own mapper in `Task.map`let rrc = RealmResultsController<TaskModel, Task>(request: request, sectionKeyPath: sectionKeypath, mapper: Task.map, filter: MyFilterFunc)
    rrc.delegate=self// With NIL filter, same as before, but we can ignore the // filter property if we don't want to use itlet rrc = RealmResultsController<TaskModel, Task>(request: request, sectionKeyPath: sectionKeypath, mapper: Task.map)
    rrc.delegate=self// OR without mapper nor filter, this is a special init. // Since we don't want to change the result type, we say to the RRC that `T` is the same as `U`. // The filter will be nil.let rrc = RealmResultsController<TaskModel, TaskModel>(request: request, sectionKeyPath: sectionKeypath)
    rrc.delegate=self
    实现RealmResultsControllerDelegate方法

    RealmResultsControllerDelegate 有 4种方法需要:

    funcwillChangeResults(controller: AnyObject)funcdidChangeObject<U>(object: U, controller: AnyObject, oldIndexPath: NSIndexPath, newIndexPath: NSIndexPath, changeType: RealmResultsChangeType)funcdidChangeSection<U>(section: RealmSection<U>, controller: AnyObject, index: Int, changeType: RealmResultsChangeType)funcdidChangeResults(controller: AnyObject)

    你可以使用以下 public 方法访问RRC中的元素:

    // Returns all the Sections including its objectspublicvar sections: [RealmSection<U>] // count of Sectionspublicvar numberOfSections:Int// Number of Objects in a SectionpublicfuncnumberOfObjectsAt(sectionIndex: Int) ->Int//Object at a given indexPath (ideal for cellForRow... in table views )publicfuncobjectAt(indexPath: NSIndexPath) -> U // Change the filter currently used. IMPORTANT! after calling // this method you should reload your table `tableView.realoadData()`publicfuncupdateFilter(newFilter: T ->Bool) 
     

    #####RealmResultsChangeType: 它是一个具有四种不同类型的enum:

    • 插入
    • 删除
    • 更新
    • 移动
    enumRealmResultsChangeType: String{
     caseInsertcaseDeletecaseUpdatecaseMove}
    的初始获取

    为了开始接收 RealmResultsController 事件,你需要进行初始获取。 之后,你将开始接收委托方法中的更改

    rrc.performFetch()

    重要信息:

    要添加/删除对象的####Methods:

    为了让 RealmResultsController 接收领域中的变更事件,你必须使用我们的定制方法。 这些是在领域扩展中声明的,并且是原始领域方法的包装器

    #####Add:

    publicfuncaddNotified<N: Object>(object: N, update: Bool=false)publicfuncaddNotified<S: SequenceTypewhere S.Generator.Element:Object>(objects: S, update: Bool=false)publicfunccreateNotified<T: Object>(type: T.Type, value: AnyObject= [:], varupdate: Bool=false) -> T?

    #####Delete:

    publicfuncdeleteNotified(object: Object)publicfuncdeleteNotified<S: SequenceTypewhere S.Generator.Element:Object>(objects: S)

    ####Notify 单一对象更新:RRC无法检测写事务内的单个对象更新。 通过调用 notifyChange() 来通知更改对象更改不是添加或者创建的方式。

    notifyChange() 是RealmObject扩展中的方法,这里有一个使用示例:

    let user =User()
     user.name="old name" realm.write {
     realm.addNotified(user)
     }
     // STUFF GOING ON... 
     realm.write {
     user.name="new name" user.notifyChange() //Notifies that there's a change on the object }

    ####RealmRequest:

    在不将对象链接到RealmResultsController的情况下,可以使用RealmRequest来检索它所请求的对象。 它将返回 Results<T>

    let predicate =NSPredicate(format: "id!= 0")let sortDescriptors = [SortDescriptor(property: "projectID"), SortDescriptor(property: "name")]let sectionKeypath ="projectID"let request = RealmRequest<TaskModel>(predicate: predicate, realm: realm, sortDescriptors: sortDescriptors)//Execute the requestlet objects = request.execute()

    你还可以让领域执行特定的请求

    
    let objects = realm.execute(request)
    
    
    
    
    

    在领域扩展上添加的####Other 方法

    #####ToArray()

    在领域,当你询问数据库中的对象时,你将接收 Results<T>,我们将一个 toArray() 方法转换为通用 Array<T>:

    let objects = realm.objects(TaskModel.self).toArray()

    ###Listen 到领域更改

    如果你使用RRC方法添加/删除对象,你可以监听所有领域变化。

    只需将观察者添加到这样的对象中:

    let object =Object()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "YOUR_FUNC", name: object.objectIdentifier(), object: nil)

    objectIdentifier()Object 扩展中定义的方法,它将为给定对象构建一个标识符。 它的结构是 ObjectType-PrimaryKeyValue

    ###Disclaimer

    目前,oab无法检测通过另一个对象关系保存的对象中引入的更改。

    例如:

    let user =User()
    user.id=123user.name="John"realm.addNotified(user)let task =Task()
    user.name="Steven"//This change is not going to be notifiedtask.assignedUser= user
    realm.addNotified(task)// There will be only one notification for the Task object

    演示:

    使用演示程序,只需运行以下命令即可使用Carthage安装领域依赖项:

    carthage update --platform iOS

    ###Installation:

    Carthage:
    
    github"redbooth/RealmResultsController""0.5.0"
    
    
    
    
    CocoaPods:

    ####⚠️: 在这里正在跟踪的CocoaPods ATM上有一个问题,正在运行。 ####Until 这是固定的,没有CocoaPods的0.5.0



    文章标签:IMP  Implementation  Swift  Realm  Nsfetchedresultscontrolle  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语