
几乎每个 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
就是这么方便。

网友评论