文章目录
  1. 1. 第三方框架
    1. 1.1. Carthage
      1. 1.1.1. 安装 Carthage
      2. 1.1.2. Cartfile
      3. 1.1.3. 集成第三方库
    2. 1.2. 使用的第三方框架
  2. 2. Realm
  3. 3. 其它

在项目初期搭建框架时所用到的代码和第三方库大都是相同或相似的,所以如果在一个已经准备好的基础模版上再进行开发应该可以达到提高项目开发效率和减少不必要的时间损失的目的。

第三方框架

Carthage

相对于 CocoaPods 新建一个 workspace,Carthage 是使用 xcodebuild 来编译出二进制库,剩下的集成工作完全交给开发人员,所以更加灵活并且对现有项目没有太多的侵略性。但是相应的使用起来也更麻烦了些,而且因为更加年轻和小众,支持的框架是少于 CocoaPods 的,更痛苦的是你不能用 search 命令查找支持的框架,所以只能自己找(只支持 GitHub 和 git 源)。但是,如果你也和我一样被 CocoaPods 漫长的编译时间折磨过的话,我相信之前的问题都不算什么了。

安装 Carthage

直接下载安装包,当然,如果没有挂上代理的话速度会相当慢~

或者使用 Homebrew 进行安装:

1
2
brew update
brew install carthage

Cartfile

类似于 CocoaPods 中的 Podfile 文件,语法都差不多:

1
2
3
4
5
github "boyXiong/XWSwiftRefresh"                                                     //使用最新版本
github "onevcat/Kingfisher" >= 2.4.0 //必须最低为 2.3.1 版本
github "SnapKit/SnapKit" == 0.22.0 //必须为 0.22.0 版本
github "Alamofire/Alamofire" ~> 3.4 //大于或等于 3.4 ,小于 2.0
git "https://enterprise.local/desktop/git-error-translations.git" "development" //使用一个私有项目,在 "development" 分支

写完之后执行carthage update命令生成各个框架。其中 Carthage/Checkouts 目录是从 github 获取的源代码,Carthage/Build 目录是编译出来的 Framework 二进制代码库。

集成第三方库

打开项目,在项目的 Target -> Build Phases -> Link Library with Libraries,将 Carthage/Build 目录中希望导入的 Framework 库导进去。

添加编译的额外脚本,点击 “+” -> New Run Script Phase。

添加脚本/usr/local/bin/carthage copy-frameworks,将各个 Framework 的路径添加到 Input Files 中。

然后在项目中 import 就可以使用了。

使用的第三方框架

  • 网络请求:Alamofire
  • 网络图片加载:Kingfisher
  • 自动布局:SnapKit
  • 上拉加载下拉刷新:XWSwiftRefresh
  • 颜色:HexColor
  • 数据库本地存储:realm-cocoa
  • 提示框:PKHUD
  • JSON解析:SwiftyJSON
  • 优化界面:AsyncDisplayKit

Realm

在数据库方面我之所以选择 Realm 主要是因为可以直接使用 Realm Browser 查看生成的数据库文件,而且相较于 Core Data 使用起来更简单一些。

新增数据:

1
2
3
4
5
6
7
8
9
10
11
12
let realm = try! Realm() //获取默认的 Realm 数据库
self.contentNewsArray = [LatestNewsInfo]()
for subJson in storiesJson.arrayValue {
let newsInfo = LatestNewsInfo() //创建一个 LatestNewsInfo 对象实例
newsInfo.id = subJson["id"].stringValue
newsInfo.title = subJson["title"].stringValue
newsInfo.images = subJson["images"][0].stringValue
try! realm.write { //向 realm 中写入新的 LatestNewsInfo 对象
realm.add(newsInfo)
}
self.contentNewsArray.append(newsInfo)
}

获取数据:

通过public func objects<T : RealmSwift.Object>(type: T.Type) -> RealmSwift.Results<T>方法可以获取全部数据,或者通过 Predicate 条件查询特定数据:

1
2
let predicate = NSPredicate(format: "type.name = '购物' AND cost > 10")
consumeItems = self.realm.objects(ConsumeItem).filter(predicate)

支持的断言:

比较操作数(comparison operand)可以是属性名称或者某个常量,但至少有一个操作数必须是属性名称;

比较操作符 ==、<=、<、>=、>、!=, 以及 BETWEEN 支持 int、long、long long、float、double 以及 NSDate 属性类型的比较,比如说 age == 45;

相等比较 ==以及!=,比如说Results<Employee>().filter("company == %@", company)

比较操作符 == and != 支持布尔属性;

对于 NSString 和 NSData 属性来说,我们支持 ==、!=、BEGINSWITH、CONTAINS 以及 ENDSWITH 操作符,比如说 name CONTAINS ‘Ja’;

字符串支持忽略大小写的比较方式,比如说 name CONTAINS[c] ‘Ja’ ,注意到其中字符的大小写将被忽略;

Realm 支持以下复合操作符:“AND”、“OR” 以及 “NOT”。比如说 name BEGINSWITH ‘J’ AND age >= 32;

包含操作符 IN,比如说 name IN {‘Lisa’, ‘Spike’, ‘Hachi’};

==、!=支持与 nil 比较,比如说 Results<Company>().filter("ceo == nil")。注意到这只适用于有关系的对象,这里 ceo 是 Company 模型的一个属性。

ANY 比较,比如说 ANY student.age < 21

注意,虽然我们不支持复合表达式类型(aggregate expression type),但是我们支持对对象的值使用 BETWEEN 操作符类型。比如说,Results<Person>.filter("age BETWEEN %@", [42, 43]])。

排序:consumeItems = self.realm.objects(ConsumeItem).filter("cost > 10").sorted("cost")

删除记录:

通过上边的方法获取到的数据可以通过 Realm 中的ppublic func delete(object: RealmSwift.Object)删除单个 Object 或public func delete<T : RealmSwift.Object>(objects: RealmSwift.List<T>) 删除多个 Object。当然,也可以通过public func deleteAll()方法删除全部。

1
2
3
realm.write {
realm.delete(cheeseBook)
}

更新记录:

可以通过直接设置更新:

1
2
3
realm.write {
consumeItem.name = "去北京旅行"
}

如果在设置 Object 的时候设置了 primaryKey 就可以直接通过public func add(object: RealmSwift.Object, update: Bool = default)或者public func create<T : RealmSwift.Object>(type: T.Type, value: AnyObject = default, update: Bool = default) -> T方法更新数据。

Object 设置方法:

1
2
3
4
5
6
7
8
9
10
import RealmSwift
class MediatorInfo: Object {
dynamic var userId: String? = ""
dynamic var userName: String? = ""
dynamic var userjob: String? = ""

override static func primaryKey() -> String? {
return "userId"
}
}

其它

  • 项目结构采取了最基础的 MVC 架构,之所以没用 MVVM 之类的架构,是因为对于 ReactiveCocoa 或 RxSwift 响应式编程框架掌握程度还不够。如果只是单独分出去一个 ViewModel 意义也不大。
  • 页面布局采取了以 StoryBoard 为主,以 SnapKit 进行代码自动布局为辅,在一些需要大量显示图片的复杂布局的地方用 AsyncDisplayKit 提高页面流畅度的方法。
  • 网页显示采用 WebKit 并通过 UIProgressView 实现进度条功能。
  • 数据接口采用的是知乎日报的接口。
  • Demo
文章目录
  1. 1. 第三方框架
    1. 1.1. Carthage
      1. 1.1.1. 安装 Carthage
      2. 1.1.2. Cartfile
      3. 1.1.3. 集成第三方库
    2. 1.2. 使用的第三方框架
  2. 2. Realm
  3. 3. 其它