DianQK / blog-comment

MIT License
0 stars 0 forks source link

一些 RxSwift 思考题 - 回答 · 靛青K #42

Open DianQK opened 7 years ago

DianQK commented 7 years ago

https://blog.dianqk.org/2017/04/03/rxswift-answer/

DianQK commented 7 years ago

invokeMethodsendMessage 的区别

sentMessagemethodInvoked 只有一个区别,sentMessage 会在调用方法前发送值, methodInvoked 会在调用方法后发送值。

示例代码如下:

override func viewDidLoad() {
    super.viewDidLoad()

    rx.sentMessage(#selector(ViewController.viewWillAppear(_:)))
        .subscribe(onNext: { value in
            print("1")
        })
        .addDisposableTo(disposeBag)

    rx.methodInvoked(#selector(ViewController.viewWillAppear(_:)))
        .subscribe(onNext: { value in
            print("3")
        })
        .addDisposableTo(disposeBag)

}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("2")
}

输出结果为:

1
2
3

不知道为何 😑 Markdown 的渲染在文章中会出问题,示例代码就写到评论了。

正好测试一下 Gitment

haodongxi commented 6 years ago

我好想发现了了不得的东西

summerHearts commented 6 years ago

hi,DianQK , 我有一个问题,麻烦帮忙看一下,谢谢。

var allCites: Variable<[CiteModel?]> = Variable([])
var searchQuery: Variable<String> = Variable("")

let model1 = CiteModel()
model1.cite = "131"

let model2 = CiteModel()
model2.cite = "331"

let model3 = CiteModel()
model3.cite = "121"

allCites.value = [model1,model2,model3]

var shownCites: Observable<[CiteModel?]> = Observable.combineLatest(allCites.asObservable(), searchQuery.asObservable()) {
    allCites, query in
    return allCites.map { cites in cites.filter { $0.cite.contains(query) } }
}

func filterCitesByQuery(query: String) {
    searchQuery.value = query
}

上面代码出现了编译报错。

DianQK commented 6 years ago

Hi,@summerHearts

你的这个 shownCites 中的代码类型基本都是混的,cites 类型是 CiteModel? ,没有对应的 filter 方法。

从上面代码看,你似乎是要做一个搜索过滤,下面代码应该能满足你的要求:

var allCites: Variable<[CiteModel]> = Variable([])
var searchQuery: Variable<String> = Variable("")

let model1 = CiteModel()
model1.cite = "131"

let model2 = CiteModel()
model2.cite = "331"

let model3 = CiteModel()
model3.cite = "121"

allCites.value = [model1, model2, model3]

var shownCites: Observable<[CiteModel]> = Observable.combineLatest(allCites.asObservable(), searchQuery.asObservable()) { allCites, query in
    allCites.filter { $0.cite.contains(query) }
}

func filterCitesByQuery(query: String) {
    searchQuery.value = query
}
summerHearts commented 6 years ago

thanks,谢谢能抽出时间帮忙!向您学习

发自网易邮箱大师 在2017年08月04日 20:11,DianQK 写道:

Hi,@summerHearts

你的这个 shownCites 中的代码类型基本都是混的,cites 类型是 CiteModel? ,没有对应的 filter 方法。

从上面代码看,你似乎是要做一个搜索过滤,下面代码应该能满足你的要求:

var allCites: Variable<[CiteModel]>=Variable([]) var searchQuery: Variable=Variable("")

let model1 =CiteModel() model1.cite="131"let model2 =CiteModel() model2.cite="331"let model3 =CiteModel() model3.cite="121"

allCites.value= [model1, model2, model3]

var shownCites: Observable<[CiteModel]>= Observable.combineLatest(allCites.asObservable(), searchQuery.asObservable()) { allCites, query in allCites.filter { $0.cite.contains(query) } }

funcfilterCitesByQuery(query: String) { searchQuery.value= query }

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or mute the thread.