素墨文胤

一日心靜一日仙、不以神力亂人間


  • Startseite

  • Archiv

iOS Project Git Ignore

Veröffentlicht am 2017-02-14 | Edited on 2018-01-23

iOS Project .gitignore

For Xcode

.DS_Store
/build/
.pbxuser
!default.pbxuser
.mode1v3
!default.mode1v3
.mode2v3
!default.mode2v3
.perspectivev3
!default.perspectivev3
xcuserdata
profile
.moved-aside
DerivedData
.idea/
.hmap
.xccheckout .xcworkspace
!default.xcworkspace
UserInterfaceState.xcuserstate

For CocoaPods

/Pods
!Podfile
!Podfile.lock

使用 Pods 私有库管理私有 Pods

Veröffentlicht am 2017-02-08 | Edited on 2018-01-23

#####私有库(Repo)使用步骤如下:
1、建立私有 Spec 库
建立一个 git 库即可,需要有 master 分支
2、添加私有库到 CocoaPods 里

1
$ pod repo add REPO_NAME REPO_SOURCE_URL

3、添加 Podspec 到私有库

1
$ pod repo push REPO_NAME SPEC_NAME.podspec

4、移除私有库

1
$ pod repo remove REPO_NAME

5、检查私有库,push 的时候会自动检查

1
$ pod repo lint REPO_NAME

6、Podfile 使用私有库
在 Podfile 里加一行 source ‘REPO_SOURCE_URL’

#####创建一个 Pod
$ pod lib create POD_NAME
或者自己手动建立工程、编辑Spec
【pod spec create 用来单独建立一个 Spec】

简繁笑谈

Veröffentlicht am 2017-01-19 | Edited on 2018-04-13

转自:https://www.zhihu.com/question/27613425

簡化的過程是隨着漢字的發展不斷演進的。從甲骨到金、篆,演化的進程一刻都沒有停歇。由篆到隸更是把一些字改得面目全非。比如「射」字,明明是張弓搭箭的動作,隸書、楷書應該寫成「弓矢」纔對,可偏偏按大致形狀簡化成了「身寸」,後來以訛傳訛,竟還有人相信「射」和「矮」倆字弄反了。不管有沒有行政命令進 行統一規範,人們都是按照使自己方便的方式寫字的,秦漢時小篆就沒有隸書流傳範圍廣。後來嫌橫平豎直的楷書麻煩,於是行、草盛行。現在偶爾還能看見手寫 「仃车就歺」字樣的牌子,按照字面意思,沒有依靠、孤苦伶仃的車也就算了,還就歺!歺是「殘骨」啊!「仃」作爲「停」的簡化字(「二簡方案」)廢止已久, 但在手寫時還有一定的生命力,無他,省事耳。就像連續抄寫「憂鬱的臺灣烏龜」100遍,那個悲傷的故事,用簡化字形「忧郁的台湾乌龟」,省四分之一的時間 沒問題吧。
現在用電腦打字多,揮毫運筆改成了擊鍵,簡體繁體字形的差異與筆劃多少,轉換到擊鍵次數上並沒有存在大的區別。形碼方案大多是默認4碼上屏,即使是 輸入「憂鬱」,也不會比「忧郁」多操作幾下;音碼就更不用說了,只要算法精良,無非就是出現重碼時默認候選位置有個先後的問題。

Weiterlesen »

Mac about

Veröffentlicht am 2016-12-24 | Edited on 2018-01-23

1、Safari JSON 格式化插件:
https://github.com/rfletcher/safari-json-formatter

iOS Array 去重方法效率比较

Veröffentlicht am 2016-12-23 | Edited on 2018-01-23

引用:http://www.cnblogs.com/someonelikeyou/p/5795090.html

#####结论:原序去重用 NSOrderedSet 或 NSMutableArray

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
- (void)testDistinctEfficiencyForArray {
NSArray *pointArray = @[[NSValue valueWithCGPoint:CGPointMake(1, 1)],
[NSValue valueWithCGPoint:CGPointMake(1, 1)],
[NSValue valueWithCGPoint:CGPointMake(2, 2)],
[NSValue valueWithCGPoint:CGPointMake(3, 3)],
[NSValue valueWithCGPoint:CGPointMake(3, 3)],
[NSValue valueWithCGPoint:CGPointMake(2, 2)],
[NSValue valueWithCGPoint:CGPointMake(4, 4)],
[NSValue valueWithCGPoint:CGPointMake(3, 3)],
[NSValue valueWithCGPoint:CGPointMake(5, 5)],
[NSValue valueWithCGPoint:CGPointMake(4, 4)]];
NSArray *numberArray = @[@1,@1,@2,@1,@3,@4,@3,@5,@1,@5];
for (NSInteger i = 0; i < 18; i ++) {
numberArray = [numberArray arrayByAddingObjectsFromArray:numberArray];
pointArray = [pointArray arrayByAddingObjectsFromArray:pointArray];
}
//numberArray.count = 2621440
NSLog(@"numberArray.count = %ld", numberArray.count);
//pointArray.count = 2621440
NSLog(@"pointArray.count = %ld", pointArray.count);

/////////////////////- 以下是 numbers 去重 -/////////////////////////
//原序, time = 0.492623, NSMutableArray 去重结果: 12345,
[self distinctItemsUsingMutableArrayForArray:numberArray];

//乱序, time = 0.803937, NSArray distinctUnionOfObjects.self 去重结果: 32514 ,
[self distinctItemsUsingArrayKVCForArray:numberArray];

//乱序, time = 0.121862, NSMutableDictionary 去重结果: 32514 ,
[self distinctItemsUsingMutableDictionaryForArray:numberArray];

//乱序, time = 0.108073, NSSet 去重结果: 32514 ,
[self distinctItemsUsingSetForArray:numberArray];

//原序, time = 0.132699, NSOrderedSet 去重结果:12345,
[self distinctItemsUsingOrderedSetForArray:numberArray];

//乱序, time = 0.110322, NSSet+distinctUnionOfObjects.self 去重结果:32514,
[self distinctItemsUsingSetKVCForArray:numberArray];


/////////////////////- 以下是 Points 去重 -/////////////////////////
//原序, time = 0.385306, NSMutableArray 去重结果: {1,1} {2,2} {3,3} {4,4} {5,5} ,
[self distinctItemsUsingMutableArrayForArray:pointArray];

//原序, time = 1.211656, NSArray distinctUnionOfObjects.self 去重结果: {1,1} {2,2} {3,3} {4,4} {5,5} ,
[self distinctItemsUsingArrayKVCForArray:pointArray];

//原序, time = 0.565697, NSMutableDictionary 去重结果: {1,1} {2,2} {3,3} {4,4} {5,5} ,
[self distinctItemsUsingMutableDictionaryForArray:pointArray];

//原序, time = 0.393808, NSSet 去重结果: {1,1} {2,2} {3,3} {4,4} {5,5} ,
[self distinctItemsUsingSetForArray:pointArray];

//原序, time = 0.492740, NSOrderedSet 去重结果: {1,1} {2,2} {3,3} {4,4} {5,5} ,
[self distinctItemsUsingOrderedSetForArray:pointArray];

//原序, time = 0.419985, NSSet+distinctUnionOfObjects.self 去重结果: {1,1} {2,2} {3,3} {4,4} {5,5} ,
[self distinctItemsUsingSetKVCForArray:pointArray];
}

- (void)distinctItemsUsingMutableArrayForArray:(NSArray *)array {
NSDate *dateOrigin = [NSDate date];

NSMutableArray *resultArray = [NSMutableArray array];
for (NSNumber *num in array) {
if ([resultArray containsObject:num] == NO) {
[resultArray addObject:num];
}
}

NSLog(@"NSMutableArray: %lf", [[NSDate date] timeIntervalSinceDate:dateOrigin]);
NSLog(@"result NSArray = %@", resultArray);
}

- (void)distinctItemsUsingArrayKVCForArray:(NSArray *)array {
//KVC容器操作
//容器不仅仅能使用KVC方法实现对容器成员传递普通的操作消息,KVC还定义了特殊的一些常用操作,使用valueForKeyPath:结合操作符来使用
//这里使用对象操作符:
//@distinctUnionOfObjects、@unionOfObjects
//@distinctUnionOfObjects操作符返回被操作对象指定属性的集合并做去重操作,而@unionOfObjects则允许重复。如果其中任何涉及的对象为nil,则抛出异常。
NSDate *dateOrigin = [NSDate date];

NSArray *resultArray = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];

NSLog(@"NSArray distinctUnionOfObjects.self: %lf", [[NSDate date] timeIntervalSinceDate:dateOrigin]);
NSLog(@"values NSArray = %@", resultArray);
}

- (void)distinctItemsUsingMutableDictionaryForArray:(NSArray *)array {
NSDate *dateOrigin = [NSDate date];

NSMutableDictionary *numDictionary = [NSMutableDictionary dictionary];
for (NSNumber *num in array) {
[numDictionary setObject:num forKey:num];
}
NSArray *resultArray = numDictionary.allKeys;

NSLog(@"NSMutableDictionary: %lf", [[NSDate date] timeIntervalSinceDate:dateOrigin]);
NSLog(@"numDictionary.allKeys NSArray: %@", resultArray);
}

- (void)distinctItemsUsingSetForArray:(NSArray *)array {
NSDate *dateOrigin = [NSDate date];

NSSet *numSet = [NSSet setWithArray:array];
NSArray *resultArray = numSet.allObjects;

NSLog(@"NSSet: %lf", [[NSDate date] timeIntervalSinceDate:dateOrigin]);
NSLog(@"numSet.allObjects NSArray : %@", resultArray);
}

- (void)distinctItemsUsingOrderedSetForArray:(NSArray *)array {
NSDate *dateOrigin = [NSDate date];

NSOrderedSet *orderNumSet = [NSOrderedSet orderedSetWithArray:array];
NSArray *resultArray = orderNumSet.array;

NSLog(@"NSOrderedSet: %lf", [[NSDate date] timeIntervalSinceDate:dateOrigin]);
NSLog(@"orderNumSet.array NSArray : %@", resultArray);
}

- (void)distinctItemsUsingSetKVCForArray:(NSArray *)array {
//KVC 容器对象操作符 distinctUnionOfObjects
NSDate *dateOrigin = [NSDate date];

NSSet *aSet = [[NSSet alloc] initWithArray:array];
NSSet *setValues = [aSet valueForKeyPath:@"@distinctUnionOfObjects.self"];

NSLog(@"NSSet+distinctUnionOfObjects.self: %lf", [[NSDate date] timeIntervalSinceDate:dateOrigin]);
NSLog(@"setValues NSSet: %@", setValues);
}

什么是正确的 MVVM 模式

Veröffentlicht am 2016-12-16 | Edited on 2018-01-23

  iOS 中 MVC 模式是比较常见的,其实 iOS 中的 MVC 大多被人认为是普通意义上的 MVP 模式。
  最新流行的是 MVVM 模式。MVVM 模式设立的初衷大概是为了使得 UI 逻辑可测吧。上图:
MVVM图
  View 和 View Controller 可以整体看成是 View 层。
  实线代表持有,通过直接引用的方式操作。
  虚线表示需要通过其他模式告知,例如 target-action、通知、KVO 等等。

  新出现的 ViewModel 层是对接 View 层的静态变量和动态响应的;
  View 静态变量的使用举例:View 上的 userName 是由 Model 的几个属性拼凑而成,我们在 ViewModel 里持有 Model 写拼凑逻辑,在 ViewController 里持有 View 后直接调用 ViewModel 里的拼凑逻辑或拼凑的结果赋值给 View 的userName;如果 Model 有更新,就通知 ViewModel,ViewModel 再通知 ViewController,让 ViewController 去修改 View 的相关内容。
  View 动态响应的使用举例:View 上的某个按钮的点击后通过 target-action 模式传递给 ViewController,ViewController 调用 ViewModel 的对应响应逻辑。
  如此一来,我们要对 UI 逻辑做测试就变得轻而易举,只需要对 ViewModel 写单元测试即可。
  ViewModel 放的是 UI逻辑,Model 放的是数据层的业务逻辑。

【后记】因为看到网上有很多对 MVVM 的错误解释,所以做此文。

Markdown 技巧汇总(持续帖)

Veröffentlicht am 2016-11-30 | Edited on 2018-01-23

#####1、MarkDown页内跳转实现
1.1. 先定义一个锚(id)

1
<span id="jump1">点此页内跳转</span>

1.2. 然后使用 markdown 的语法:(比普通链接多了个井号)

1
[XXXX](#jump1)

CocoaPods 指南

Veröffentlicht am 2016-11-27 | Edited on 2018-01-23

#####何为 Cocoa ?
  Cocoa 是 Mac OS X 上的五大 API 之一,是苹果的面向对象开发框架。
  其他四大 API 分别是:
  Carbon:是苹果的非面向对象的开发框架,比 Cocoa 的层次更低,比较类似于微软视窗操作系统的 Win32 API。
  POSIX:是可移植操作系统接口(Portable Operating System Interface)的缩写,定义了操作系统应该为应用程序提供的接口标准,其正式称呼为 IEEE 1003,国际标准名称为 ISO/IEC 9945。
  X11:也叫 X Window 系统,是一种位图显示的视窗系统,它是在 Unix 和 Unix-like 操作系统以及 OpenVMS 上建立图形用户界面的标准工具包和协议。
  Java:苹果提供了 Java 到 Cocoa 的绑定,但是在开发者中并未得到广泛采用.

#####何为 CocoaPods ?
  CocoaPods:Cocoa 的依赖管理器,用来管理 Xcode 工程的依赖关系。
  我们指定依赖关系时只需要在 Podfile 文件里书写即可。CocoaPods 会递归解决依赖,并且创建、关联 Xcode workspace 来建立项目。

#####CocoaPods 的原理
  CocoaPods 将所有的依赖库都放到另一个名为 Pods 的项目中,然后让主项目依赖 Pods 项目,这样,源码管理工作都从主项目移到了 Pods 项目中。Pods 项目最终会编译成一个名为 libPods.a 的文件,主项目只需要依赖这个 .a 文件即可。

#####安装 CocoaPods
  CocoaPods 使用 Ruby 建立的,所以要先安装 Ruby 环境。(淘宝 Ruby 镜像已不可用)
  RubyGems 是 Ruby 的程序包管理器。

1
2
3
4
5
$ gem sources --remove https://rubygems.org/ 【删除国外 gem 源】
$ gem sources --add https://gems.ruby-china.org/ 【添加国内 gem 源】
$ sudo gem update --system 【更新 gem 库】
$ sudo gem install cocoapods【用 gem 安装 cocoapods】
$ pod setup【更新 pod 依赖库,需时长】

  在项目根目录下用 $ pod init 生成“Podfile”的文件,然后书写依赖。书写完毕后执行:

1
$ pod install【安装 Podfile 指定的 pod 依赖库】

  Podfile文件内容的格式应该如下:

1
2
3
platform :ios, '8.0' 【注明你的开发平台以及版本,'8.0'忽略不写即为最新版本】
pod 'AFNetworking', '~> 2.5.3' 【'~> 2.5.3'为版本号,忽略不写即为最新版本】
......

  第三方库的版本号可以直接指定,比如’2.0’,也可以加修饰符,修饰符有 >、>=、<、<=、~> 五种,其中“~> a.b.c”表示使用大于等于 a.b.c 但小于a.(b+1).0 的版本,即该版本到下一个大版本之间的版本。
  注意:Podfile.lock 文件记录下了当时用的 Pods 依赖库的版本供 pod install 使用,故需要加入版本管理,以避免 Pod 依赖库版本不一致。

#####使用 CocoaPods 私有库架构 APP
  CocoaPods 在小型项目中可以直接指定 AFNetworking 等第三方类库来使用,然而从架构上讲,提供给开发人员使用的不应该直接是第三方类库,而应该是使用更简单、更切合实际业务需求的私有库。

######私有库在 Podfile 中的写法如下:

1
pod 'APod', :git => 'https://xxxx/xxx/APod.git', :tag => '0.0.1' 【私有 pod 库路径、版本指定】

######私有库的建立
1、在 Github、Coding 或 Gitlab 上建立私有 pod 库(.git)。
2、在本地创建 APod 开发工程,并关联到远程库。(最好将最终提供的类放在一个文件夹里,比如 “Lib” 文件夹)

1
2
3
$ cd 工程目录
$ git init
$ git remote add origin https://git.coding.net/xxx/APod.git

3、如果要 pod 进第三方类库,就 $ pod init 生成 Podfile 后书写依赖,然后$ pod install。
4、在开发工程根目录下新建 .podspec 文件,命令如下:

1
$ pod spec create APod

5、编写 Spec 文件。需要注意:
5.1、s.version 可以先设为远端库有的 tag 号。
5.2、pod 进来的依赖要在 s.dependency 指定。
5.3、s.library(系统库)、s.framework(系统框架) 要正确配置。
5.4、s.source_files、s.public_header_files 需要正确配置。如果我们的输出文件都放在了 “Lib” 文件夹下,s.source_files = “Lib/.{h,m}”,s.public_header_files = “Lib/.h”
6、验证 Spec 文件是否合格,命令如下:

1
$ pod spec lint

如果有一些小问题不通过,可以忽略。
7、将代码推到远端库。

1
2
3
4
5
6
7
8
$ 改 s.version = '0.0.1'
$ git add -A
$ git commit -m "Release 0.0.1."

$ git pull
$ 解决冲突后继续;注意确保 s.version 是自己期望的值
$ git tag '0.0.1'
$ git push --tags

8、现在可以在其他项目中使用该 pod 了。写法见上一节。如果引用的时候用 “” 找不到头文件,就换 <> 试试。

#####CocosPods 官方帮助页
  https://guides.cocoapods.org

123…12

梁遜

一日心靜一日仙、不以神力亂人間

90 Artikel
10 Tags
© 2018 梁遜
Erstellt mit Hexo v3.4.4
|
Theme — NexT.Muse v6.2.0