第九块石头

让 Rails 支持 Response 数据 GZip 压缩

| Comments

做网络请求时,一直想用 GZip 对 JSON 进行压缩后传输,但是一直没空弄,听说不难。这两天试了一下,果然不难。

在 Rails 项目根目录下的config.ru,加入use Rack::Deflater,如下:

config.ru
1
2
3
4
# This file is used by Rack-based servers to start the application.
require ::File.expand_path('../config/environment',  __FILE__)
use Rack::Deflater
run Wending::Application

重启服务器即可。

如何判断是否生效了?那就来个测试。

PCH 文件中进行全局 Import 的注意事项

| Comments

pch 文件可是个好东西,把常用的定义或者 import 放在 pch 中,这样在不用在项目中再引用和定义了,即可以做到全局 macro,又可以作为全局 import 用。

然而最近在用 DTCoreText 和 ZipArchive 时,发现无论怎么调试,都无法编译通过,出现类似很多类名 not found,甚至是 NSString 都未找到!!

后来研究了好久,原来这两个库有用 C 和 C++ 编译。而 pch 文件对于 C 的文件一样有效。试想一下,C 的代码引用 OC 的代码,会出现什么?当然是编译失败!

问题找到了,如何让 C 的文件编译的时候不引用 OC 的代码呢?

突然想起我们经常看到一个这个定义:

1
2
3
4
#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif

看来这个ifdef __OBJC__就是用于判断是否是 OC 文件的!!我以前一直以为这个宏是判断项目是否用 OC 编译的!!当时还纳闷,啥时候会出现不用 OC 写 iOS 项目?

因此,在原来的 pch 里面适当的将代码用这个ifdef __OBJC__包起来,就解决了 C 的文件引入 OC 代码的问题!!

rootViewController 更改动画的注意事项

| Comments

WindowrootViewController属性在 iOS5 之后都期望被设置,因为旋转等原因,controller 控制 View 比自己控制 View 更安全。

但是突然出现一个需求,需要更换主WindowrootViewController,那如何做UIView动画呢?

1
2
3
4
5
6
7
[UIView transitionWithView:[[UIApplication sharedApplication].delegate window]
                  duration:0.4
                   options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                    [[[UIApplication sharedApplication].delegate window] setRootViewController:vc];
                }
                completion:NULL];

咋看之下没啥问题,运行起来也没问题。能成功实现替换为新的vc

然后出现一个很诡异的问题——如果设备是横的,新的vc对应的View会有一个旋转的动画,导致动画混乱,甚至很奇怪的动画。

刚开始以为是vc.view加载太慢,后来没解决。Google 了一下,发现有人解决了。将上面的代码改为:

1
2
3
4
5
6
7
8
9
10
[UIView transitionWithView:[[UIApplication sharedApplication].delegate window]
                  duration:0.4
                   options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                    BOOL oldState = [UIView areAnimationsEnabled];
                    [UIView setAnimationsEnabled:NO];
                    [[[UIApplication sharedApplication].delegate window] setRootViewController:vc];
                    [UIView setAnimationsEnabled:oldState];
                }
                completion:NULL];

使用CocoaAsyncSocket发送TCP/UDP消息

| Comments

习惯上每次使用一个类库的功能,我第一时间想到的都是Google那个类库的使用例子。这不是一个好习惯,这次我下载了CocoaAsyncSocket的代码,找了好一阵没找到满意的例子。灰心丧气之余想到很多用到我写的代码的人们也是不看文档,不看注释的。他们给我带来了巨大的困扰,而我现在也不看别人的注释和文档,假如CocoaAsyncSocket的作者要为我服务的话,那他肯定也会吐血不止。

于是,我决定自力更生,从代码注释里找找我需要功能的用法。

我需要的功能是,用TCP或者UDP发送一些数据给服务器,不用关心服务器是否收到数据。

下面例子,只是TCP的发送过程,UDP请自行看注释。

毕业2年的感触

| Comments

时光飞逝,一晃工作两年了。2011年的6月30日,带着对同学的不舍,带着对未来道路的迷茫,带着对即将开始人生第一份工作的激动,离开了华电的大门。在离开的那一刻,我相信,我们一定会变得很优秀,大家都要加油~

开始了人生中的第一份工作后,一切变得好新鲜。接触了很多人、很多事,每天都在成长着,每当睡前回想白天的事情,总是会有一种“当时不应该这么做”或者“要是这么做就好了”的反省。无论是生活中、工作中,处事中、技术中,遇到的一切的一切,总是让我成长。

2011/7~2011/8,边学习 Ruby On Rails 边做服务器后台,有趣的是,还得同时学习 iOS。由于缺少经验,总是拿不清主次,捡了芝麻丢了西瓜,把精力花在细枝末节上。现在想想,当时真的好天真~虽然现在也好不到哪里去~

MacOS常用小众软件收集

| Comments

打算迁移系统了,但是不想采用升级的方式,毕竟一个系统用久了,有好多垃圾文件,无论是自己遗留的还是系统或者第三方软件遗留的,总之硬盘是越来越小了。既然打算升级,干脆来一个大换血吧。

经常有收集各种小软件的习惯,有的确实很不错,有的可能则是新颖但是不实用,装了就没用过~~整理出个人觉得相当不错的,好装到新系统。

以下软件都能正常运行于10.8系统。

MacOS常用QuickLook扩展插件收集

| Comments

MacOS里有一个相当人性化的功能——QuickLook,选中一个文件,不用打开它,只用按一下空格键,立即可以看到文件内容或者信息,相当快。然而悲剧的是,并不是所有文件类型都被支持的!!如果按了空格键,发现只是显示文件图标,只好很无奈的在按空格键把它关了,再去把文件打开,早知道就直接打开文件了~忧伤啊~

以前导出搜索不错的插件,最近发现,用 brew cast 可以完全帮我们安装。

请移步到 https://github.com/sindresorhus/quick-look-plugins

小知识:让 QuickLook 也能选择文字,只需要在终端中执行以下命令:

1
defaults write com.apple.finder QLEnableTextSelection -bool true && killall Finder

Key-Value编程笔记——基础

| Comments

Key-Value Coding是一种非直接访问对象属性的机制,使用字符串来定位属性,而不是直接调用属性的getter或者setter等访问器。

如果属性是简单类型,例如scalar, String或者Boolean,将会转换为NSNumber处理。如obj的a属性是Boolean:

1
2
[obj valueForKey:@"a"] // 获得@YES
[obj setValue:@YES forKey:@"a"] // 传递NSNumber,而不是YES

Key必须遵循OC命名规范:ASCII编码,以小写字母开头,不含空格。

keyPath是将key组合后的一种方便用法,用点分割属性名:

可变长度对象在KVO中的实现

| Comments

KVO是降低代码耦合度的一种很有效的方法,以往我都是对某个实例的属性进行监控,获取他的变化情况。其本质上是监控属性的地址的变化。然而对于可变长度的对象,如NSMutableArrayNSMutableDictionary等,向这种对象进行添加成员,其的地址不会发生变化,普通的KVO方法自然就不能用了。该如何监控可变长度对象的内容变化呢?

Google了一下,又查阅了官方文档,目前有两种方法:

  • 手动实现insert方法和remove方法 文档
  • 调用系统的mutableValueForKey:方法,自动触发KVO 文档

第一种方法具体实现逻辑还不是很清楚,有待进一步深入学习Key-Value编程。

第二种方法使用了Proxy。