Swift中实现Observable机制
猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!  
原文地址: http://blog.csdn.net/cocos2der/article/details/51917539
今天给别人讲个Observable的实现和使用场景,结合Observable-Swift github: https://github.com/slazyk/Observable-Swift 讲了半天貌似还没有特别明白,故写了个简易的实现,讲述了下Observable属性监控机制。
//: Playground - noun: a place where people can play
import UIKit
import Foundation
// MARK: - Observable
class Observable<T> {
    // 定义block结构
    typealias Observer = T -> Void
    // 申明一个block,用于数据改变的执行
    private var observer: Observer?
    // 数据发生变更,则通过observer告知
    var value: T {
        didSet {
            observer?(value)
        }
    }
    init(_ v: T) {
        value = v
    }
    func observe(observer: Observer?) {
        self.observer = observer
        observer?(value)
    }
}
// MARK: - People
struct PeopleModel {
    let firstName: Observable<String>
    let lastName: Observable<String>
    init(firstName: String, lastName: String) {
        self.firstName = Observable(firstName)
        self.lastName = Observable(lastName)
    }
}
// MARK: - Test
// test1
let people = PeopleModel(firstName: "sunny", lastName: "liu")
people.firstName.observe {
    newValue in
    print("firstName changed: \(newValue)")
}
people.lastName.observe {
    print("lastName changed: \($0)")
}
people.firstName.value = "sunny2"
people.lastName.value = "liu2"
// test2
class House {
    let lableHouseName =  UILabel()
    init() {
    }
    var people: PeopleModel? {
        didSet {
            people?.firstName.observe{
                [unowned self] in
                self.lableHouseName.text = $0
            }
        }
    }
}
这样貌似容易理解了,O(∩_∩)O哈哈~
Swift中实现Observable机制的更多相关文章
- Swift中类似C++和ruby中的final机制
		
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在C++和ruby语言的错误处理中有一种final机制 ...
 - 阿里巴巴最新开源项目 - [HandyJSON]  在Swift中优雅地处理JSON
		
项目名称:HandyJSON 项目地址:https://github.com/alibaba/handyjson 背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发 ...
 - Swift中的可选链与内存管理(干货系列)
		
干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...
 - Swift Explore - 关于 Swift 中的 isEqual 的一点探索
		
在我们进行 App 开发的时候,经常会用到的一个操作就是判断两个对象是否相等.比如两个字符串是否相等.而所谓的 相等 有着两层含义.一个是值相等,还有一个是引用相等.如果熟悉 Objective-C ...
 - Swift中的延迟加载(懒加载)
		
Swift方式的延迟加载 而在Swift中,你只需一行代码即可实现此机制: lazy var players = String[]() 简单.简洁,直入主题. 但你得记住,你必须使用var关键字来定义 ...
 - Swift中 @objc 使用介绍
		
在swift 中 如果一个按钮添加点击方法 如果定义为Private 或者 定义为 FilePrivate 那么会在Addtaget方法中找不到私有方法 但是又不想把方法暴露出来,避免外界访问 ,那 ...
 - swift 该死的派发机制--待完成
		
swift 该死的派发机制 final static oc类型 多态类型 静态类型 动态函数 静态函数 nsobject: 1.缺省不再使用oc的动态派发机制: 2.可以使用nsobject暴露出来 ...
 - Swift中的map 和 flatMap 原理及用法
		
之前对这两个概念有点糊,今天正好遇到一个相关需求,才深入了解了下. 需求如下: 大概就是对一个数组的model,重构成一个新model,返回得到一个新数组 用map很容易实现,不过后来我需要对其中进行 ...
 - Swift中Notification.Name这么难用怎么办
		
Swift中Notification.Name这么难用怎么办 以前的发送通知的参数就是一个简单的字符串: NSNotificationCenter.defaultCenter().post(" ...
 
随机推荐
- Linux下打包tar.gz
			
将heben-addressbookinit打包成heben-addressbookinit.tar.gz格式 方式1:czvf heben-addressbookinit.tar.gz heben- ...
 - Python笔记(一)——打印输出
			
一.输出语句input 输出语句print 例:用户输入 username = input("username:") #变量名 显示的字符 password = input( ...
 - iphone inline video fragments
			
DOMContentLoaded 它在DOM加载之后及资源加载之前被触发 通过递归调用同一方法来不断更新画面以达到动起来的效果,但它优于setTimeout/setInterval的地方在于它是由浏览 ...
 - 关于一些基础的Java问题的解答(二)
			
6. Hashcode的作用 官方对于hashCode的解释如下: Whenever it is invoked on the same object more than once during an ...
 - 阿里云部署Node.js项目(CentOS)
			
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,用来方便地搭建快速的易于扩展的网络应用.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又 ...
 - samba服务器配置过程
			
SAMBA服务器配置 yum install samba samba-client samba-swat 改变文件权限及用户 vi /etc/samba/smb.conf d+G全删注释 复制下面代码 ...
 - C++笔记002:VS2010报错:LINK  fatal error LNK1123 转换到 COFF 期间失败文件无效或损坏
			
原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 错误描述: 1>------ 已启动生成: 项目: FirstCode, 配置: Debug Win32 ------ 1>生 ...
 - 学习在.NET Core中使用RabbitMQ进行消息传递之持久化(二)
			
前言 上一节我们简单介绍了RabbitMQ和在安装后启动所出现的问题,本节我们开始正式进入RabbitMQ的学习,对于基本概念请从官网或者其他前辈博客上查阅,我这里不介绍基础性东西,只会简单提一下,请 ...
 - POJ 3050 Hopscotch  DFS
			
The cows play the child's game of hopscotch in a non-traditional way. Instead of a linear set of num ...
 - 自定义下拉刷新上拉加载View
			
MainActivity.java package com.heima52.pullrefresh; import java.util.ArrayList; import com.heima52.pu ...