我对RxSwift很失望
最近的一个项目使用RxSwift开发,的确遇到不少问题。其中一些是RxSwift本身的问题,无法解决,只能忍受或者采取其他方式。现在给我总体的感觉是,RxSwift的优势和劣势各占一半,所以,并不是强烈推荐,而是一种可用可不用的态度。
一般APP用的最多的控件就是UITableview,RxCocoa里有对UITableview的封装,但是有个限制,就是,所有的cell所绑定的model必须是同一个类型。也就是说,如果我的这个tableview里有不同的cell存在,那是实现不了的。为了弥补这个很明显的不足,RxSwift社区给出了另外一个补充的库RxDataSources。这个库最大的不同就是可以实现多个Section,所以,上面提到的一个tableview如何包含不同的类型的cell问题就可以通过在不同section里来实现不同的cell来解决。多么烂的一个解决方法!!!一有不同的cell就来一个section!
另外从RxDataSources的名字可以看出来,它只实现了DataSource的方法,也就是我们说的DataSourceDelegate里的方法。如果要调用UITableViewDelegate方法还需要继续使用RxCocoa里的TableView扩展。所以,无论如何也避免不了各种混用!
Moya路径中包含问号的解决办法
写RxSwift的网络部分,一般都推荐用Moya,Moya有对RxSwift的扩展。
我需要请求的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"
}
}
结果请求地址为:
https://www.xxx.com/api/org/LoadOrganizationUsers%3ForgId=2&loadChild=true
这里的问号被转码成%3F,导致请求失败。
咋一看,第一想到自己的用法不对,应该是有地方设置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/")!
}
}
很尴尬,都可以带参数了,还叫baseURL吗?