如何优雅请求后台配置接口?

明天谁将成为天选之子?

几乎每个 APP 都有这样一个接口:专门用来放无处安放的数据,比如说帮助中心的 url,再比如说 app 的下载地址。

我称这个接口为后台配置接口。

对这个接口,曾经的我做了诸多尝试,最终的处理方式是:

懒加载

要用到这些数据的时候才请求这个接口:

// 数据模型
class ConfigInfoModel: BaseModel {
    /// 下载链接
    var downloadUrl = ""
    /// 新手指引
    var instructionUrl = ""
}

class Config {
    
    // 后台配置信息
    static var info: ConfigInfoModel? {
        get {
            if _info == nil {
                let semaphore = DispatchSemaphore(value: 0)
                // 请求后台配置信息
                LoadConfigInfo(success: { (infoModel) in
                    // 保存
                    self._info = infoModel
                    semaphore.signal()
                }, failure: { (errorStr) in
                    Hud.showInfo(errorStr)
                    semaphore.signal()
                })
                semaphore.wait()
            }
            return _info
        }
        set {
            self._info = newValue
        }
    }
    
    private static var _info: ConfigInfoModel?
    
}


利用信号量实现返回闭包中的值;
利用类型属性保存数据;

注意等待信号和发送信号不要放在同一个线程,否则会造成死锁。

这样一来,你就完全不用关心什么时候请求这个接口了,反正用到的时候就会自动请求,要用相关数据的时候直接拿来用就行了:

// 随时随地直接用,内部已自动进行网络请求
let downloadUrl = Config.info.downloadUrl

就是这么方便。

推荐阅读更多精彩内容