分类 笔记 下的文章

在使用SwiftyJSON做数据传输的时候,经常需要从JSON格式中取值到对象中,在开发ios应用时,对象的字段和类型通常也是固定的,如何在接口获取到数据的时候优雅的进行类型转换是一个很值得考虑的细节。

优雅不仅是在可读性上提高,同时也方便后期对于数据格式的管理维护。

否则每次做细节调整的时候,需要查找所用的工作量就不可小觑了。

在网上也有通过反射机制来实现所有类自动转换的,见参考1。逻辑上是成立的,没有仔细研究。实际测试发现无法转换(与语言版本等可能有关)。

这里我先用比较务实的方式,做一层封装。主要完成的是将JSON赋值操作,写入到对象的结构体中,这样的话我们就不用在业务流程中进行复杂的赋值操作了。

1. 设计一个用于支持JSON互转的接口

这里我设计了两种初始化的方式,实际上一种就够了 主要是调用的时候写法略有不同,且便捷初始化开销更小一点。 我个人会喜欢以函数名来区分不同的运作方式,所以额外增加了静态的fromJSON方法


protocol JSONable {

    /** 便利初始化方式将对象注册为Object */
    convenience init( data:JSON )

    /** 静态函数方式 */
    static func fromJSON( data:JSON ) -> Self

    /** 将对象导出到JSON格式 */
    func toJSON() -> JSON?
}

2. 模型、结构体继承并实现接口


struct Category:JSONable{

    var id:String
    var count:Int
    var covers: [String]

    convenience init( data:JSON ){
        id = data["id"].stringValue
        count = data["count"].intValue
        covers = data["covers"].arrayValue as! [String]
    }

    static func fromJSON( data:JSON ){
        return self.init( id: data["id"].stringValue, count: data["count"].intValue, covers: data["covers"].arrayValue as! [String] )
    }

    func toJSON() -> JSON?{
        var j = JSON()
        j["id"].string = id
        j["count"].int = count
        j["covers"].array = covers
    }
}

3. 调用


let testJSONString = "{\"id\":\"test001\",\"count\":100,\"covers\":[\"a\",\"b\",\"c\"]}"
let testJSON = JSON.init(parseJSON: testJSONString)

// JSON转Model
// 方式1
var category = Category( data: testJSON )

// 方式2
var category = Category.fromJSON( data: testJSON )

// 转换到JSON
let jString = category.toJSON()

参考:

Swift反射之自定义对象转成JSON字符串

想要做好iOS的应用开发,深入的理解Cocoa框架是十分重要的。 今天做一下自上而下梳理,这样在开发的时候会更清晰,遇到问题也可以更容易的找到方向。

OS X架构中的Cocoa Cocoa in the architecture of OS X

iOS架构中的Cocoa Cocoa in the architecture of iOS

Cocoa

Mac OS X上五大API之一 Cocoa, Carbon, POSIX, X11, Java

Bundle

在 Cocoa环境下,app所在的完整包被称之为Bundle。 其中Mac OS下的app不是必须在沙盒环境中,而iOS环境中的一定在沙盒环境。 通过NSBundle类可以访问当前包所处的位置用于读取相关文件等。

nib文件(.xib) 和storyboard

从最宽泛的角度来说,nib文件包含对象,而故事版是由一些相互关联的nib文件组成的有机分组。在几乎所有情况下,nib文件和故事版都只包含界面。 nib文件的扩展名为.nib或.xib。xib文件是一种基于xml格式存储的nib文件。[1]

参考: Cocoa - Apple Documentation

  1. Swift与Cocoa框架开发 - Paris Butfield-Addison
  2. Cocoa 百度百科
  3. iOS 的Cocoa框架,Foundation框架以及UIKit框架

字符串替换

REPLACE ( fieldname, search, replace )

数据去重

DELETE ...

DELETE FROM table_copy 
WHERE key IN ( 
    SELECT t.key FROM (
    SELECT key FROM table_copy GROUP BY key having count(*) >1
    ) t
) 
AND id NOT IN(
    SELECT t.id FROM (
    SELECT id FROM table_copy GROUP BY key having count(*) >1
    ) t
)

在CentOS下可以通过shell脚本执行定时任务 在macos下 有类似的功能 使用crontab

crontab的格式:

f1 f2 f3 f4 f5 program
# 分(0-59) 时(0-23) 日(1-31) 月(1-12) 周(0-6) 程序

# 其中如果要执行 每x分钟 则使用 */x
# 如果使用* 表示任意次数

* * * * * curl https://test.com
# 表示每分钟都会使用curl打开 test.com

crontab的基本使用:

sudo -i # 进入root权限
crontab -l # 查看定时任务
crontab -e # 编辑定时任务
crontab -r # 删除定时任务

如何定时执行本地的php项目呢 首先crontab -e打开定时任务

*/10 * * * * /usr/bin/php /Library/WebServer/Documents/...test.php >>/Library/WebServer/Documents/...test.log

*/10 表示 每10分钟执行一次 >> 表示 追加输出到 test.log文件 > 表示覆盖输出到test.log php目录需要使用绝对位置 否则不会以root权限执行,会出现执行时的目录权限问题。

除了命令行php方式运行,还可以用 wget,curl方式打开本地的php脚本

譬如:

* * * * curl http://localhost/...test.php > /Desktop/test.log

说来有点惭愧用了1年多的git至今还没有创建过分支,主要都是把git当成一个线上同步来用。 细想起来是因为我很难集中精力细看git的说明文档,另一方面很多网上的文章说的比较晦涩抽象,很难简明扼要的吸收要点。 但是git这些强大的功能到底作用是什么? 如何和实际工作联系,怎么样简单快速的get到这些功能的意义和使用方式呢? 今天就好好get一下。

git init

“这个文件夹,被我征用了,我要用它来做我的代码版本控制,其他工作就交给git你了。”

初始化仓库 初始化之后,git就会在这里生根发芽。

git clone git@xx.com/sth.git folder

“快帮我建一个和sth一样的仓库,放到folder文件夹就行了。(嗯,仓库我还没建,你看着办)”

克隆仓库到文件夹 如果对这个仓库的历史数据不感兴趣,使用--depth n告诉git,别搞这么沉重,我只关心他现在的样子。 不指定文件夹的话、git会默认使用master自动创建。 git clone --depth 1 git@xx.com/sth.git folder

git pull git@xx.com/sth.git folder

“帮我把sth的最新的代码搬过来,放在我仓库的folder文件夹里就行。(我喜欢的就是我的)”

从仓库拉取数据

git add file1 file2 file3

“这几个文件以后麻烦多照顾啦。”

让仓库追踪文件。 添加追踪之后,每次文件变化都会被git检查。 git add . (自动添加全部未跟踪的文件)

git status

“魔镜魔镜告诉我,我都对这些代码做了什么修改呀?”

显示当前的文件状态。

git commit

“那就让来我告诉你,这些文件的修改都有什么非同凡响的意义。”

标记当前变化的注释 命令行中需要单独输入commit的具体内容,输入完成后保存,如mac使用 shift+; 然后 wq。

git branch branchName

创建一个分支,意思是: “hi git,把现在的代码库做个时空胶囊,名字叫branchName”(记得单机游戏的存档吗?) 创建完分支,我们可以随时回到当时那个状态,当然也可以在那个时空胶囊的基础上继续发展、产生新的历史~~

git checkout branchName

进入某个分支,意思是:“请把我带回到branchName的时候,我要去创造那个时空的代码啦。” 主分支默认叫master 回到主线使用 git checkout master

拉取的时候可以通过 sparse clone 实现对指定文件夹的拉取

这样做通常是为了只下载核心的代码,不希望文件过多过于臃肿。

后来发现另一个更重要的,特别是在一个项目刚开始克隆别人的项目时,使用 --depth 参数来设置拉取深度更有效。

需要注意的是,可能和版本有关 也可能git语法就是这样。 --depth 需要写在 add,clone之后 不能写在语句结尾,否则是无效的。

网上对于挂载磁盘方式很多,有命令行的也有一键挂载的sh

这里做一个比较有条理的总结

  1. 查看当前磁盘情况

    fdisk -l
    # 这时会显示系统所支持的硬盘 每个硬盘有一个盘符 如 /dev/vda
  2. 挂载磁盘到对应目录( 相当于为磁盘访问创建一个快捷方式 )

     mount /dev/vda /mydisk
     # 挂载  盘符名称  快捷方式名称
    
     # 如果挂载错误 可以卸载
     umount /dev/vda/ /mydisk

如果过程中需要对盘符进行格式化

mke2fs ext4 /dev/vda
# 格式化  格式 盘符

什么是循环?

循环就是反复的做一件事情,尽管每次都可能一模一样 也有可能略有差别。 无论是打扑克、还是打麻将,其实都是符合循环这个概念。

譬如说,打斗地主的时候我们每次都要不停的从牌堆中抓一张牌,大家分别取一张,直到牌堆里的牌只剩3张。

每一次的抓牌就是循环的一个过程。

那么for循环和while循环的差别是什么呢?

如果用女人可以理解的方式来说的话,那么

for循环是 曾经有一份真诚的爱情放在我的面前....... 我希望是 10000年

while循环是 山无棱、天地合,乃敢与君绝

在无意间漫游网上的文章时,看到一个指出对JavaScript误解的部分提到了这个关于JavaScript私有对象的问题。

Private Members in JavaScript

在该文章中指出,在对象内部使用 var 创建的变量属于私有变量、这个是外部无法访问的。 在这里var的变量我们换一种说法就是局部变量。事实上不能算是真正的私有属性。

我们知道在面向对象编程中,一个类的属性、方法如果能够被其他类访问调用,那么这个是public 公开属性、方法。 但是他有一个隐式条件就是,他也能被类自身其他的方法访问。类的private 私有属性、方法虽然不能被外部属性访问,但是他是需要满足被同一个父类下的其他方法访问的。

而局部变量是方法内部创建的,他只能在当前方法的生命周期内被调用,如果一个JavaScript对象中包含了多个方法,在方法内部var创建的属性和方法,是不能被其他任何方法、包括同一个类的其他子方法调用。


在现代JavaScript的很多案例中,如果希望保持属性的私有性,我们一般可以采用 封装返回的方式生成对象。

var Constructor = function( id, el ){
    var obj = {};
    var id = id;
    obj.getElement = function(){ return el; }
    obj.getId = function(){ return id; }
    return obj;
}

在上述对象构造方法中,我们可以通过getElement(),getId()分别取出对应的元素和id,但是无法直接使用 .id, .el 的方式获取到对应的值、也无法直接修改更新该值。