Swift网络封装库Moya中文手册之Targets
Targets
使用Moya,我们首先需要定义一个target - 这通常是继承 TargetType
协议的 枚举
变量。接下来,你的app只需要处理这些targets,也就是一些你希望调用API完成的操作。例如:
FavouriteTweet(tweetID: String)
。
示例代码:
public enum GitHub {
case Zen
case UserProfile(String)
case UserRepositories(String)
}
Targets必须继承 TargetType
。
TargetType
协议要求在枚举中定义一个 baseURL
属性。 注意:baseURL的值不会取决于 self
的值, 而是返回一个固定值(如果你使用多个API base URL,需要使用多个枚举和Moya providers)。这是extension的开头:
extension GitHub: TargetType {
public var baseURL: NSURL { return NSURL(string: "https://api.github.com")! }
path
可以用来拼接相对路径,例如:
public var path: String {
switch self {
case .Zen:
return "/zen"
case .UserProfile(let name):
return "/users/\(name.URLEscapedString)"
case .UserRepositories(let name):
return "/users/\(name.URLEscapedString)/repos"
}
}
注意:这里我们使用了一个String的扩展方法 URLEscapedString
。
文章末尾给出了方法的实现。
现在需要给枚举设置 method
。在这个示例中,我们只需要用到GET方法, 这很简单:
public var method: Moya.Method {
return .GET
}
如果你的请求需要POST或者别的方法,可以通过switch self
来返回合适的值。与我们获取 path
属性用到的方法相同。
我们的 TargetType
进展不错,不过还没完成。我们还需要一个 parameters
属性来返回不同的网络请求参数。示例代码:
public var parameters: [String: AnyObject]? {
switch self {
case .UserRepositories(_):
return ["sort": "pushed"]
default:
return nil
}
}
不同于之前的 path
属性, 我们这里其实不关心 UserRepositories
传入的参数,所以这里使用 _
来忽略这个参数。
最后,看看 sampleData
属性。这是 TargetType
协议所必须的。任何你想要调用的target必须提供一些非空的 NSData
类型的返回值。这可以用作后期测试或者为其他开发者提供离线支持。这个属性应该随 self
的变化而改变。
public var sampleData: NSData {
switch self {
case .Zen:
return "Half measures are as bad as nothing at all.".dataUsingEncoding(NSUTF8StringEncoding)!
case .UserProfile(let name):
return "{\"login\": \"\(name)\", \"id\": 100}".dataUsingEncoding(NSUTF8StringEncoding)!
case .UserRepositories(let name):
return "[{\"name\": \"Repo Name\"}]".dataUsingEncoding(NSUTF8StringEncoding)!
}
}
做完这些,构造 Provider 就很简单了:
let GitHubProvider = MoyaProvider<GitHub>()
Escaping URLs
这是一个扩展的示例,可以简单的将普通字符串"like this" 转换为URL编码字符串"like%20this":
extension String {
var URLEscapedString: String {
return self.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())!
}
}
转载请注明出处http://www.cnblogs.com/liuliuliu/p/5624026.html,并注明转载。
原文链接
翻译: bibibi_liuliu
联系方式: 395985239@qq.com
posted on 2016-06-29 13:51 bibibi_liuliu 阅读(1103) 评论(1) 编辑 收藏 举报