设置 Git 代理

如果经常逛 GitHub,经常 clone GitHub 上某个仓库的代码,那么就会经常遇到一个问题,看下图

小一点的仓库可能等一下就过去了,如果是很大的仓库,如这个 Git 的源代码仓库,或者 CocoaPodsSpecs 仓库,这些仓库的大小可能在几百M,Specs 仓库 clone 下来是300M 左右,如果是几十K的速度,等 clone 完成人就已经疯了,这也是为什么在配置 CocoaPods 后,运行 pod setup 命令时总是卡半天不动的原因所在。如果手上有代理,且代理的质量还不错,那么就可以考虑让 Git 走代理,这样可以提高 clone 代码时的速度,改善生活质量:)

使用 JavaScriptCore 实现 JS和OC间的通信

iOS 开发中,我们时不时的需要加载一些 Web 页面,一些需求使用 Web 页面来实现可以更可控,如上线后也可以发布更新,修改 UI 布局,或者修复 bug,这些 Web 页面的作用不止是展示,很大一部分是需要和原生代码实现的 UI 和业务逻辑发生交互的,那么不可避免的,就需要用一些方法来实现 Web 页面(主要是 JavaScript)和原生代码之间的通信,在 JavaScriptCore 出现之前,很多项目都在用 WebViewJavascriptBridge 作为 Web 页面和原生代码之间的一个桥梁(bridge),来传输一些数据和方法的调用,如 Facebook MessengerFacebook Paper 等。

选中 UITableViewCell 及保存选中状态的正确方式

在开发过程中,经常用到一个控件就是 UITableView ,我们时常会需要处理一个 cell 的选中状态,以给用户一些提示:「我选中了这个」,如果尝试在 tableView:cellForRowAtIndexPath: 方法调用 setSelected:animated: 方法,代码如下:

1
2
3
4
5
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
[cell setSelected:YES animated:YES];
return cell;
}

运行后会发现是没有效果的,cell 最终会是未选中状态,可以在自定义的 UITableViewCell 子类中重写 setSelected:animated: 方法,加上断点看到,每个 cellsetSelected:animated: 方法会被调用三次

一个 Bug,一件小事

前两天同事想在项目中集成 ReactiveCocoa,选择了使用 CocoaPods 安装,结果编辑 Podfile 并运行 pod install 命令安装后,无法编译运行,报错信息如下

1
/Users/xx/Desktop/code/PodTest/Pods/ReactiveCocoa/ReactiveCocoaFramework/ReactiveCocoa/RACTuple.h:10:9: 'metamacros.h' file not found

RAC 中的函数式编程 和 链式调用

更新 2016.8.13
这篇文章对函数编程的理解有误,望各位看官慎重参考!


最近用 RAC 比较多,RAC 被称为函数响应式编程(FRP)框架,各种教程中对响应式的特性介绍比较多,对函数式特性的介绍不怎么多,一直不太明白 RAC 的函数式编程的特性体现在哪里,今天想起来一个概念,链式调用,查了一下后才明白 RAC 中的函数式编程体现在哪里。

新玩具,Poker 2

今天入手了人生第二把机械键盘,Poker 2,先上个图

之前一直在用 Keycool 104 茶轴,用了两年,一方面这把键盘是全尺寸的,比较占空间,另一方面当时选键盘的时候比较保守,选了「万金油」茶轴,茶轴是手感是比较没有什么特色的,各轴的特色都有一点,但是都没有做到极致。这次换键盘瞄准了青轴或者红轴,青轴太吵,在办公室用的话,比较考验人品,且据说因为段落感太强用久了会累(还没有壕到买一把来试一下,所以只能听说了。。。)最后准备入手红轴,目标有 Filco 忍者87、Filco Minila Air 67 蓝牙版、 Cherry G80-3494和 Poker 2,前两把价位都在1000左右,有点贵,Cherry 那把这两天京东有活动可以优惠到780块,价格还可以接受,不过太大了,真的太大了,比Keycool 104还要大很多,最终选择了 Poker 2,昨天下单,顺丰加持,北京发货今天下午就到广州了,晚上回来拿到拆了包装感受一下。还不错。

理解 Autorelease Pool

问题

之前被问到两个问题

  • Autorelease Pool 中有什么对象?
  • Autorelease Pool 中的对象在什么时候释放?

之前对这两个问题不是很确定,查了点资料,其中苹果文档中有这样一段

In a reference-counted environment (as opposed to one which uses garbage collection), an NSAutoreleasePool object contains objects that have received an autorelease message and when drained it sends a release message to each of those objects. Thus, sending autorelease instead of release to an object extends the lifetime of that object at least until the pool itself is drained (it may be longer if the object is subsequently retained). An object can be put into the same pool several times, in which case it receives a release message for each time it was put into the pool.

文档中说的很明确,在引用计数环境中(而不是垃圾回收机选)Autorelease Pool 中包含了收到 autorelease 消息的对象,并在 「倾倒」 Autorelease Pool 的时候,给其中的每个对象发送 release 消息。

反向代理 GitHub Pages 并配置博客 HTTPS 访问

使用 GitHub 的 Pages 服务可以很方便的搭建个人博客,安全稳定,加上有很多开源的静态博客生成器 https://www.staticgen.com/ 大部分只需要在本地安装,生成网站,并发布到 Pages 的 repo 中即可,还是挺方便的。基本上配置好后,只管写文章就好。

静态博客有很多好处,不需要数据库,页面加载速度快(当然这根服务器有很大关系),大部分生成器支持 Markdown,自定义主题,可以部署在任何服务器上,只要可以在公网访问就可以了。GitHub 的 Pages 服务足够稳定也很方便,唯一的不足大概就是自定义域名的时候不能启用 HTTPS 访问吧,看样子 GitHub 一时半会儿是不会支持这个特性,那还是自己来吧。 Let’s Encrypt 已经结束 Beta 很久,就想着把博客搬到 VPS 上,启动 HTTPS,前两天脑补了一个方案

今天就试着动手折腾一下。

使用 Karabiner 映射快捷键

用快捷键做某些操作是很方便的,很多软件也提供了快捷键,但是某些软件只提供了固定组合的快捷键,这些组合不一定合口味,如果不习惯,就可以用 Karabiner 更改快捷键映射,把想用的快捷键映射到某些软件的快捷键上,下面以欧路词典为例,讲一下过程。

欧路词典只提供这三个快捷键任意组合

这三个键用到的地方太多了,似乎怎么组合都容易冲突,而且我个人习惯来说,之前用 BetterTouchToolShift+Command+W 映射到了 三指轻拍 这个动作来取词,所以我准备把 Shift+Command+W 映射到欧路词典中设置的 Control+Commmand上用来取词