RxSwift使用小记

我对RxSwift很失望

最近的一个项目使用RxSwift开发,的确遇到不少问题。其中一些是RxSwift本身的问题,无法解决,只能忍受或者采取其他方式。现在给我总体的感觉是,RxSwift的优势和劣势各占一半,所以,并不是强烈推荐,而是一种可用可不用的态度。

一般APP用的最多的控件就是UITableviewRxCocoa里有对UITableview的封装,但是有个限制,就是,所有的cell所绑定的model必须是同一个类型。也就是说,如果我的这个tableview里有不同的cell存在,那是实现不了的。为了弥补这个很明显的不足,RxSwift社区给出了另外一个补充的库RxDataSources。这个库最大的不同就是可以实现多个Section,所以,上面提到的一个tableview如何包含不同的类型的cell问题就可以通过在不同section里来实现不同的cell来解决。多么烂的一个解决方法!!!一有不同的cell就来一个section

另外从RxDataSources的名字可以看出来,它只实现了DataSource的方法,也就是我们说的DataSourceDelegate里的方法。如果要调用UITableViewDelegate方法还需要继续使用RxCocoa里的TableView扩展。所以,无论如何也避免不了各种混用!

Moya路径中包含问号的解决办法

RxSwift的网络部分,一般都推荐用MoyaMoya有对RxSwift的扩展。

我需要请求的APIget请求:

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吗?

你可能感兴趣的:(RxSwift使用小记)