• RAC的坑


    http://www.cocoachina.com/industry/20140609/8737.html

    1.对数组的观察

    有了这些Category,大部分的Delegate都可以使用RAC来做。或许你会想,可不可以subscribe NSMutableArray.rac_sequence.signal,这样每次有新的object或旧的object被移除时都能知道,UITableViewController就可以根据dataSource的变化,来reloadData。但很可惜这样不行,因为RAC是基于KVO的,而NSMutableArray并不会在调用addObject或removeObject时发送通知,所以不可行。不过可以使用NSArray作为UITableView的dataSource,只要dataSource有变动就换成新的Array,这样就可以了。

    2.Cell复用时的清理

    说到UITableView,再说一下UITableViewCell,RAC给UITableViewCell提供了一个方法:rac_prepareForReuseSignal,它的作用是当Cell即将要被重用时,告诉Cell。想象Cell上有多个button,Cell在初始化时给每个button都addTarget:action:forControlEvents,被重用时需要先移除这些target,下面这段代码就可以很方便地解决这个问题:

    [[[self.cancelButton
        rac_signalForControlEvents:UIControlEventTouchUpInside]
        takeUntil:self.rac_prepareForReuseSignal]
        subscribeNext:^(UIButton *x) {
        // do other things
    }];

    3.RACCommand自动绑定

    button.rac_command = [[RACCommand alloc]initWithEnable:xxx signalBlock:xxx];

    button的enabled自动与command的enabled绑定,无需另外声明。

    4.combineLatest触发时机

    combineLatest后面跟的信号集合中,每个信号都有值之后就会第一次触发,之后,任意一个信号有了新值就会触发。

    rac_liftSelector:withSignals 也是类似,它的意思是当signalA和signalB都至少sendNext过一次,接下来只要其中任意一个signal有了新的内容,相应方法就会自动被触发。

    5.RACObserve自动sendNext

    使用RACObserve观察属性时,会立即将属性当前值sendNext.

    6.rac_willDeallocSignal不会sendNext,只会sendComplete

    7.实践建议

    当一个signal被一个subscriber subscribe后,这个subscriber何时会被移除?答案是当subscriber被sendComplete或sendError时,或者手动调用[disposable dispose]。

    当subscriber被dispose后,所有该subscriber相关的工作都会被停止或取消,如http请求,资源也会被释放。

    Signal events是线性的,不会出现并发的情况,除非显示地指定Scheduler。所以-subscribeNext:error:completed:里的block不需要锁定或者synchronized等操作,其他的events会依次排队,直到block处理完成。

    Errors有优先权,如果有多个signals被同时监听,只要其中一个signal sendError,那么error就会立刻被传送给subscriber,并导致signals终止执行。相当于Exception。

    生成Signal时,最好指定Name, -setNameWithFormat: 方便调试。

    block代码中不要阻塞。

     

  • 相关阅读:
    laravel疑难问题---5、laravel的api开发
    laravel报403错误
    JS数组常用方法---14、2个归并方法
    JS字符串常用方法(自)---10、总结
    JS字符串常用方法(自)---9、字符串匹配
    win7便笺元数据损坏,最新解决办法
    【转】OS X 中快速调出终端
    【转】实用API大全
    免费手机号码归属地API查询接口
    【转】Intellij IDEA 提交代码到远程GitHub仓库
  • 原文地址:https://www.cnblogs.com/guoxiaoqian/p/4691035.html
Copyright © 2020-2023  润新知