• 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

  • 相关阅读:
    ISO/IEC 9899:2011 条款6.9.1——函数定义
    ISO/IEC 9899:2011 条款6.9——外部定义
    ISO/IEC 9899:2011 条款6.8.6——跳转语句
    ISO/IEC 9899:2011 条款6.8.5——迭代语句
    Objective-C轻量级泛型
    ISO/IEC 9899:2011 条款6.8.4——选择语句
    ISO/IEC 9899:2011 条款6.8.3——表达式与空语句
    ISO/IEC 9899:2011 条款6.8.2——标签语句
    ISO/IEC 9899:2011 条款6.8.1——标签语句
    ISO/IEC 9899:2011 条款6.8——语句和语句块
  • 原文地址:https://www.cnblogs.com/liuliuliu/p/5624026.html
Copyright © 2020-2023  润新知