我對RxSwift很失望
最近的一個項目使用RxSwift開發(fā),的確遇到不少問題。其中一些是RxSwift本身的問題,無法解決,只能忍受或者采取其他方式?,F(xiàn)在給我總體的感覺是,RxSwift的優(yōu)勢和劣勢各占一半,所以,并不是強(qiáng)烈推薦,而是一種可用可不用的態(tài)度。
一般APP用的最多的控件就是UITableview,RxCocoa里有對UITableview的封裝,但是有個限制,就是,所有的cell所綁定的model必須是同一個類型。也就是說,如果我的這個tableview里有不同的cell存在,那是實現(xiàn)不了的。為了彌補這個很明顯的不足,RxSwift社區(qū)給出了另外一個補充的庫RxDataSources。這個庫最大的不同就是可以實現(xiàn)多個Section,所以,上面提到的一個tableview如何包含不同的類型的cell問題就可以通過在不同section里來實現(xiàn)不同的cell來解決。多么爛的一個解決方法?。?!一有不同的cell就來一個section!
另外從RxDataSources的名字可以看出來,它只實現(xiàn)了DataSource的方法,也就是我們說的DataSourceDelegate里的方法。如果要調(diào)用UITableViewDelegate方法還需要繼續(xù)使用RxCocoa里的TableView擴(kuò)展。所以,無論如何也避免不了各種混用!
Moya路徑中包含問號的解決辦法
寫RxSwift的網(wǎng)絡(luò)部分,一般都推薦用Moya,Moya有對RxSwift的擴(kuò)展。
我需要請求的API,get請求:
http://api.xxx.com/org/LoadOrganizationUsers?orgId=6
這個是一個非常普通的URL
var baseURL: URL {
return URL(string: "https://www.xxx.com/api/")!
}
var path: String {
switch self {
case .loadOrganizationUsers(let orgId):
return "org/LoadOrganizationUsers?orgId=\(orgId)&loadChild=true"
}
}
結(jié)果請求地址為:
https://www.xxx.com/api/org/LoadOrganizationUsers%3ForgId=2&loadChild=true
這里的問號被轉(zhuǎn)碼成%3F,導(dǎo)致請求失敗。
咋一看,第一想到自己的用法不對,應(yīng)該是有地方設(shè)置URLEncode之類的,很可惜,Moya沒有提供這類方法。通過google找到解決辦法,依然是很爛的方法!
簡單說就是,將帶問號的地址放到baseURL里
var baseURL: URL {
switch self {
case .loadOrganizationUsers(let orgId):
return URL(string: "https://www.xxx.com/api/org/LoadOrganizationUsers?orgId=\(orgId)&loadChild=true")!
default:
return URL(string: "https://www.xxx.com/api/")!
}
}
很尷尬,都可以帶參數(shù)了,還叫baseURL嗎?