加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift-ReactiveCocoa3.0(一)Signal

发布时间:2020-12-14 02:02:05 所属栏目:百科 来源:网络整理
导读:环境:XCode6.3.2、swift1.2 ReactiveCocoa就不作太多介绍了。 MVVM框架思想网上也有很多介绍:http://www.tuicool.com/articles/Ub2MZju ReactiveCocoa已发展到3.0版本,相对2.x有较大改变,特别加入Swift的支持,所以特此记录下来。 1、信号-Signal 与oc

环境:XCode6.3.2、swift1.2

ReactiveCocoa就不作太多介绍了。
MVVM框架思想网上也有很多介绍:http://www.tuicool.com/articles/Ub2MZju

ReactiveCocoa已发展到3.0版本,相对2.x有较大改变,特别加入Swift的支持,所以特此记录下来。

1、信号-Signal
与oc不同,Swift不支持宏定义,所以oc的RAC、RACObserver的创建、绑定信号功能已经不适用,所以使用新的类:Signal、SignalProducer。

  • 初始化:
//创建信号和观察者
let (signal,observer) = Signal<String?,NoError>.pipe()
//创建一个信号,一个观察者(Observer类型后面介绍)

Signal的用法跟OC版的差不多,只是结合了Swift的语法特点,通过重载运算符 |> 全局方法

  • 映射Map:
//转换为一个新值
|> map { text in return (text as String).uppercaseString }
  • 过滤Filter:
|> filter { text in return count(text as String) > 3 }
  • 忽略nil值:
|> ignoreNil
  • 指定最多执行次数
|> take(2)  //若为0,则不执行next:,直接completed:
  • 转为数组
|> collect 
  • 跳过指定次数
|> skip(3)  跳过3next:只执行第四次
  • 延迟执行:
|> delay(2,onScheduler: QueueScheduler()) //切换到指定线程 延迟2秒执行next:、completed: 
  • 切换线程:
|> observeOn(UIScheduler()) //将next:、error:、completed:等事件执行在主线程/子线程
  • 监控事件:
|> observe() 
    //error:调用了sendError
    //completed:调用了completed
    //interrupted:调用了sendInterrupted
    //next:调用了sendNext
  • 通知错误事件:
sendError(observer,NSError(domain: "",code: 404,userInfo: ["result":"Not Found"]))
通知观察者有错误发生
  • 通知值发生改变:
sendNext(observer,"New Value")
注:必须是Signal创建时的第一个类型
  • 通知发生中断:
sendInterrupted(observer)
  • 通知完成:
sendCompleted(observer)
  • 合并完成与错误事件:
|> materialize  //sendError转为sendCompleted
  • 逆materialize:
|> dematerialize //看了源码应该是当sendError时抛错中断程序


2、观察者-Observer
通过源码发现observer是SinkType的子类、从字面上难以理解,暂且当作是一个栈。
查看sendNext:源码

public func sendNext<T,E: ErrorType,S: SinkType where S.Element == Event<T,E>>(var sink: S,value: T) {
    sink.put(.Next(Box(value)))
}

sink就是sendNext(observer,“”)中的observer。
这里向栈中发送一个Event,经过一轮内部处理最终回调到我们的map、filleter、skip、take、observer等方法上。

好了,大概介绍得差不多,还有几个没看懂的 以后再补上。
因为Swift语法的简洁性和源码的复杂性、看源码还是有点吃力,不过使用起来太方便了,这里不得不佩服ReactiveCocoa的作者。


以上个人笔记、转载请出名出处。谢谢!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读