HappyCoding:] ChildhoodAndy

思维世界的发展,在某种意义上说,就是对惊奇的不断摆脱。——爱因斯坦

The Internet's Own Boy

| Comments

年度最佳纪录片,程序员最爱The Internet's Own Boy,讲述Aaron Swartz创建RSS、Markdown、Reddit、Creative Commons、web.py的传奇一生,请花点时间学习这种信仰与追求。

ios音频录制"prepareToRecord"模拟器崩溃解决办法

| Comments

问题描述

在心城的开发过程中,在处理音频部分时,有这么段代码

NSError* error;
self.audioRecorder = [[AVAudioRecorder alloc] initWithURL:[self getTempAudioPath] settings:settingDic error:&error];;
//...
if ([self.audioRecorder prepareToRecord]) {
    [self.audioRecorder record];
}

在模拟器上崩溃,始终停在了prepareToRecord这一行,但真机测试没问题。怀疑是模拟器的bug。
Stackoverflow问题讨论

解决办法(不是办法的办法)

在测试音频录制功能时,先暂时禁用掉Xcode的全局断点功能。之后,恢复正常开启全局断点。(默认快捷键:Command+Y)

原文链接:https://github.com/dabing1022/Blog/issues/5

如何在Objective-C中实现链式语法?

| Comments

在接触到开源项目 Masonry 后,里面的布局约束的链式写法让我颇感兴趣,就像下面这样

UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.equalTo(superview.mas_top).with.offset(padding.top); //with is an optional semantic filler
    make.left.equalTo(superview.mas_left).with.offset(padding.left);
    make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
    make.right.equalTo(superview.mas_right).with.offset(-padding.right);
}];

其他语言比如 Lua, 实现链式语法很容易。但在 Objective-C 中,如何实现链式语法呢?

注:这里讨论的链式语法特指的是点链式语法,不同于中括号链式语法,如[[[[someObj method1] method2] method3] method4:someParam]。中括号链式语法相对而言更简单些,每个方法的返回值是下一个方法的发送者即可。

查看 Masonry 源码,起初没看明白,于是搜索了下 Stackoverflow,没有发现类似的问题,便将这个问题发布在了 Stackoverflow 上。这里是地址。

总结了下,贴下代码,做个说明。

@class ClassB;
@interface ClassA : NSObject

// 1. 定义一些 block 属性
@property(nonatomic, readonly) ClassA *(^aaa)(BOOL enable);
@property(nonatomic, readonly) ClassA *(^bbb)(NSString* str);
@property(nonatomic, readonly) ClassB *(^ccc)(NSString* str);

@implement ClassA

// 2. 实现这些 block 方法,block 返回值类型很关键,影响着下一个链式
- (ClassA *(^)(BOOL))aaa
{
    return ^(BOOL enable) {
        //code
        if (enable) {
            NSLog(@"ClassA yes");
        } else {
            NSLog(@"ClassA no");
        }
        return self;
    }
}

- (ClassA *(^)(NSString *))bbb
{
    return ^(NSString *str)) {
        //code
        NSLog(@"%@", str);
        return self;
    }
}


// 这里返回了ClassB的一个实例,于是后面就可以继续链式 ClassB 的 block 方法
// 见下面例子 .ccc(@"Objective-C").ddd(NO)
- (ClassB * (^)(NSString *))ccc
{
    return ^(NSString *str) {
        //code
        NSLog(@"%@", str);
        ClassB* b = [[ClassB alloc] initWithString:ccc];
        return b;
    }
}

//------------------------------------------
@interface ClassB : NSObject
@property(nonatomic, readonly) ClassB *(^ddd)(BOOL enable);

- (id)initWithString:(NSString *)str;

@implement ClassB

- (ClassB *(^)(BOOL))ddd
{
    return ^(BOOL enable) {
        //code
        if (enable) {
            NSLog(@"ClassB yes");
        } else {
            NSLog(@"ClassB no");
        }
        return self;
    }
}

// 最后我们可以这样做
id a = [ClassA new];
a.aaa(YES).bbb(@"HelloWorld!").ccc(@"Objective-C").ddd(NO)

原文地址:https://github.com/dabing1022/Blog/issues/4

新版标签、数据概念图

| Comments

《心城》1.3.0版本目前可以在AppStore下载

迭代的这几个版本,还没有正式迈入到我们设想的功能点。

在下面的1.4.0版本中,我们俩决定按照之前设想的,加入标签系统,这套系统会成为组织数据的一个核心,今天上午我自己出了个概念图,不过当务之急要将功能、流程走通。

解决pod search出来的仓库版本低于github仓库版本的方法

| Comments

问题描述

我们在用 Cocoapods 做第三方开源库管理的时候,有时候发现

$ pod search XXX

版本低于github上仓库的最新release版本 (注:XXX为仓库名称)

解决方法-->升级Cocoapods版本

查看当前系统Cocoapods版本命令:pod --version

升级方法

$ sudo gem update --system
$ gem sources --remove https://rubygems.org/ 
$ gem sources -a http://ruby.taobao.org/ 
$ sudo gem install cocoapods
$ pod setup

其中

$ gem sources --remove https://rubygems.org/ 
$ gem sources -a http://ruby.taobao.org/ 

这两句话可以省略,但我们在天朝,还是加上的好。国内网络原因(你懂的),如果使用原来的https://rubygems.org/,那么在sudo gem install cocoapods的时候,存放在 Amazon S3 上面的资源文件间歇性连接失败。

升级结束后再次pod --version,会发现 Cocoapods 版本号高于之前的版本,升级成功了。

再次

$ pod search XXX

OK,github仓库的最新版已经有了。