GK 4.4.0

GK 4.4.0

测试已测试
语言语言 SwiftSwift
许可证 BSD
发布日期最后发布2016年1月
SPM支持 SPM

Daniel Dahan 维护。



GK 4.4.0

GraphKit

欢迎来到 GraphKit

GraphKit 是一个用 Swift 编写的 CoreData 框架。它旨在简化与 CoreData 一起工作时遇到的复杂性,同时提供无缝的数据驱动架构。

特性

  • [x] 线程安全
  • [x] 存储任何数据类型,包括二进制数据
  • [x] 关系建模
  • [x] 分析用动作建模
  • [x] 使用图论和集合论建模
  • [x] 分面搜索 API
  • [x] JSON 工具集
  • [x] 异步 / 同步保存
  • [x] 数据驱动架构
  • [x] 数据模型观察
  • [x] 完备的单元测试覆盖
  • [x] 示例项目

要求

  • iOS 8.0+ / Mac OS X 10.9+
  • Xcode 7.2+

沟通

  • 如果您 需要帮助,请使用 Stack Overflow。 (标签 'graphkit')
  • 如果您想 提出一般性问题,请使用 Stack Overflow
  • 如果您 发现了一个 bug并且可以提供重复步骤,请提交问题。
  • 如果您 有功能请求,请提交问题。
  • 如果您 想贡献,请提交拉取请求。

安装

嵌入式框架需要 iOS 8 或 OS X Mavericks (10.9) 或更高版本的最低部署目标。

访问安装页面以了解如何使用 CocoaPods 和 Carthage 安装 GraphKit。

变更日志

GraphKit 是一个增长的项目,在其开发过程中可能会遇到变化。建议在更新版本之前查看变更日志

示例

  • 访问 Examples 目录以查看使用 GraphKit 的示例项目。

游览

实体

实体是一种模型对象,用于表示人、地点或事物。例如,公司、照片、视频、用户、人和笔记。在代码中,其表示方式如下。

GraphKitEntity

let graph: Graph = Graph()

// Create a Person Entity.
let elon: Entity = Entity(type: "Person")
elon["firstName"] = "Elon"
elon["lastName"] = "Musk"

let path: String = NSBundle.mainBundle().pathForResource("ElonMusk", ofType: "png")!
elon["photo"] = UIImage(contentsOfFile: path)

graph.save()

了解更多关于实体的信息

关系

关系是一种模型对象,它建立了两个实体之间的关系。例如,“马克是Facebook的员工”。马克Facebook是形成员工类型关系的两个实体。在代码中,其表示方式如下。

GraphKitRelationship

let graph: Graph = Graph()

// Create a Person Entity.
let mark: Entity = Entity(type: "Person")
mark["firstName"] = "Mark"
mark["lastName"] = "Zuckerberg"

let path: String = NSBundle.mainBundle().pathForResource("MarkZuckerberg", ofType: "png")!
mark["photo"] = UIImage(contentsOfFile: path)

// Create a Company Entity.
let facebook: Entity = Entity(type: "Company")
facebook["name"] = "Facebook"

// Create an Employee Relationship.
let employee: Relationship = Relationship(type: "Employee")
employee["startDate"] = "February 4, 2004"

// Form the relationship.
employee.subject = mark
employee.object = facebook

graph.save()

请注意,关系的信息存储在员工关系中,使马克Facebook都可以自由地形成其他关系。这是使用关系时的一个关键原则。

了解更多关于关系的信息

操作

操作是一种模型对象,它在实体主题集合与实体对象集合之间建立关系。例如,“苹果收购了Beats Electronics”。收购操作捕捉了在一个单一关系中可能被用于提出诸如,“哪家公司收购了Beats Electronics?”或“苹果收购了哪些公司?”等问题的公司实体。在代码中,其表示方式如下。

GraphKitAction

let graph: Graph = Graph()

// Create a Company Entity.
let apple: Entity = Entity(type: "Company")
apple["name"] = "Apple"

// Create a Company Entity.
let beats: Entity = Entity(type: "Company")
beats["name"] = "Beats Electronics"

// Create an Acquired Action.
let acquired: Action = Action(type: "Acquired")
acquired["acquisitionDate"] = "May 28, 2014"

// Form the action.
acquired.addSubject(apple)
acquired.addObject(beats)

graph.save()

请注意,操作的信息存储在收购操作中,使苹果Beats Electronics都可以自由地形成其他操作。这是使用操作时的一个关键原则。

了解更多关于操作的信息

分组

分组用于将实体、关系和操作组织成不同类型的集合。这使得多个类型可以存在于单个集合中。例如,照片和视频实体类型可以存在于名为媒体的分组中。另一个例子是将照片和图书实体类型包含在用户账户的收藏夹分组中。以下是使用分组的示例。

let graph: Graph = Graph()

let photo: Entity = Entity(type: "Photo")
photo.addGroup("Media")
photo.addGroup("Favorites")
photo.addGroup("Holiday Album")

let video: Entity = Entity(type: "Video")
video.addGroup("Media")

let book: Entity = Entity(type: "Book")
book.addGroup("Favorites")
book.addGroup("To Read")

graph.save()

// Searching groups.
let favorites: Array<Entity> = graph.searchForEntity(groups: ["Favorites"])

数据驱动

随着数据在您的应用程序中移动,可能会观察到信息的状态以创建响应式体验。以下是一个监视“用户点击按钮”时的示例。

// Set the UIViewController's Protocol to GraphDelegate.
let graph: Graph = Graph()
graph.delegate = self

graph.watchForAction(types: ["Clicked"])

let user: Entity = Entity(type: "User")
let clicked: Action = Action(type: "Clicked")
let button: Entity = Entity(type: "Button")

clicked.addSubject(user)
clicked.addObject(button)

graph.save()

// Delegate method.
func graphDidInsertAction(graph: Graph, action: Action) {
    switch(action.type) {
    case "Clicked":
      print(action.subjects.first?.type) // User
      print(action.objects.first?.type) // Button
    case "Swiped":
      // Handle swipe.
    default:break
    }
 }

分面搜索

为了探索GraphKit中的复杂关系,搜索API采用了分面设计。以下示例展示了如何使用图形搜索API。

搜索多个实体类型。

let graph: Graph = Graph()
let collection: Array<Entity> = graph.searchForEntity(types: ["Photo", "Video"])

搜索多个实体分组。

let graph: Graph = Graph()
let collection: Array<Entity> = graph.searchForEntity(groups: ["Media", "Favorites"])

搜索多个实体属性。

let graph: Graph = Graph()
let collection: Array<Entity> = graph.searchForEntity(properties: [(key: "name", value: "Eve"), ("age", 27)])

同时搜索多个分面将聚合所有结果到单个集合中。

let graph: Graph = Graph()
let collection: Array<Entity> = graph.searchForEntity(types: ["Photo", "Friends"], groups: ["Media", "Favorites"])

可以使用过滤器对搜索结果进行缩小。例如,在购买中搜索书籍标题和分组。

let graph: Graph = Graph()

let collection: Array<Action> = graph.searchForAction(types: ["Purchased"]).filter { (action: Action) -> Bool in
    if let entity: Entity = action.objects.first {
        if "Book" == entity.type && "The Holographic Universe" == entity["title"] as? String  {
            return entity.hasGroup("Physics")
        }
    }
    return false
}

JSON

JSON是一种广泛用于序列化数据的格式。GraphKit附带一组JSON工具。以下是它的使用示例。

// Serialize Dictionary.
let data: NSData? = JSON.serialize(["user": ["username": "daniel", "password": "abc123", "token": 123456789]])

// Parse NSData.
let j1: JSON? = JSON.parse(data!)
print(j1?["user"]?["username"]?.asString) // Output: "daniel"

// Stringify.
let stringified: String? = JSON.stringify(j1!)
print(stringified) // Output: "{\"user\":{\"password\":\"abc123\",\"token\":123456789,\"username\":\"daniel\"}}"

// Parse String.
let j2: JSON? = JSON.parse(stringified!)
print(j2?["user"]?["token"]?.asInt) // Output: 123456789

许可

版权所有 © 2015 - 2016,Daniel Dahan和CosmicMind,Inc. http://cosmicmind.io。保留所有权利。

在满足以下条件的情况下,允许以源代码形式或以二进制形式重新分发和使用,无论是否修改

  • 源代码重新分发必须保留上述版权声明、本列表条件以及以下免责声明。
    ...(以下内容省略)

  • 二进制形式的再分发必须包含上述版权声明、本许可列表及以下免责声明,在随分发的文档或其它材料中。

  • 未经特定事先书面许可,不得使用GraphKit或其贡献者的名称来认可或推广由本软件派生的产品。

本软件由版权所有者和贡献者“按原样”提供,并明确否认任何明示或暗示的保证,包括但不限于对适销性、对特别目的的适用性的暗示保证。在任何情况下,均不应对版权所有者或贡献者因使用本软件而产生的任何直接、间接、偶然、特殊、示范性或后果性损害(包括但不限于替代货物或服务的采购;使用、数据或利润的丧失;或业务的中断)承担责任,无论该损害是出于何种原因以及基于何种法律责任理论(无论是否由于疏忽或其它),即使版权所有者或贡献者已被告知此类损害的可能性。