2016-01-06 84 views
0

有两个功能,如下所示。大部分功能都是相同的。它的想法是从getResponse()[Helper Callback]获取webservice的输出,解析并通过getResult()将信息传递给包装器回调。处理闭包 - 使代码更通用

static func getAllDealers(dealerSearchServiceDomain: ARSDealerSearchServiceDomain, wrapperCallback:(getResult:() throws -> Void) -> Void) throws 
    { 
     try ARSInputValidator.validateZipCode(dealerSearchServiceDomain.zip) 

     try ARSDealerConnection.getAllDealers(dealerSearchServiceDomain, helperCallback: { (getResponse) -> Void in 

      do 
      { 
       let result = try getResponse() 

       try ARSDealerParser.parseDealerSearchResponse(dealerSearchServiceDomain) 

       wrapperCallback(getResult: { return }) 
      } 
      catch 
      { 
       wrapperCallback(getResult: { throw error }) 
      } 
     }) 
    } 

    static func getDealerDetails(dealerDetailsServiceDomain: ARSDealerDetailsServiceDomain, wrapperCallback:(getResult:() throws -> Void) -> Void) throws 
    { 
     try ARSDealerConnection.getDealerDetails(dealerDetailsServiceDomain, helperCallback: { (getResponse) -> Void in 

      do 
      { 
       let result = try getResponse() 

       try ARSDealerParser.parseDealerDetailsResponse(dealerDetailsServiceDomain) 

       wrapperCallback(getResult: { return }) 
      } 
      catch 
      { 
       wrapperCallback(getResult: { throw error }) 
      } 

     }) 
    } 

我想添加一个单独的功能,为共同的功能,例如,

static func parser(serviceCallDomain: ARSServiceCallDomain ,wrapperCallback:(getResult:() throws -> String) -> Void, helperCallback:(getResponse:() throws -> String) -> Void) throws 
    { 
     helperCallback { (getResponse) -> Void in 

但是有一个编译错误&我不能够把它完成。有15个以上的Web服务调用,所以显示的一个常见问题将会非常有帮助。

下一步,我还需要将parseDealerSearchResponse()& parseDealerDetailsResponse()函数传递给常用函数。

我是新来的关闭。请帮助。

//编辑 - 加样

我对Git中的问题的样本 - 请参阅类Layer1.swift https://github.com/vivinjeganathan/ErrorHandling/tree/Closures-Refactor

+0

请注意,您的“通用功能”示例不完整,请向我们展示您构建此功能的完整尝试。有点偏离主题:注意'Void'只是'()'的一个typealias(空元组_type_('()'也是非可选'()'type)的单个值),因此'( getResult:()throws - > Void) - > Void)'等同于'(getResult:()throws - >()) - >())'。即使对此没有明显的约定,后者与在同一表达式中不混合该类型的类型和类型相关是一致的。 – dfri

+0

......最后,返回'()'的函数/闭包不需要明确地说明这一点,例如,您的'parser'签名中的'wrapperCallback'参数可以采用稍微更紧凑的形式'wrapperCallback:(getResult :()throws - > String)'。 – dfri

+0

@dfri我编辑了这个问题。在Github中添加了一个示例项目... – vivin

回答

1

我认为最好的,你可以做重构代码是定义

static func handleResponse(parser: Parser, validator: Validator, getResult:() throws -> AnyObject, completion: (getParsedResult:() throws -> AnyObject) -> Void) { 
    do 
    { 
     let result = try getResult() 
     let parsedObject = try parser.parse(result) 
     try validator.validate(parsedObject) 
     completion(getParsedResult: { return parsedObject }) 
    } 
    catch 
    { 
     completion(getParsedResult: { throw error }) 
    } 
} 

通知它接收T:是处理一些像解析和验证的通用功能,并最终调用完成关闭回控制器,像这样的功能他解析器,验证器,其捕获从下面的层和属于最终用户(通常是视图控制器)完成闭合,然后将此函数的结果的闭合,可以使用这样的:

static func getAllDealers(dealerSearchServiceDomain: AnyObject, wrapperCallback:(getResult:() throws -> AnyObject) -> Void) throws { 
    let validator = DealersValidator() // create real validator 
    let parser = DealersParser() // create real parser 

    try validator.validate(dealerSearchServiceDomain) 

    try ARSDealerConnection.getAllDealers(dealerSearchServiceDomain, helperCallback: { (getResponse) -> Void in 
     self.handleResponse(parser, validator: validator, getResult: getResponse, completion: wrapperCallback) 
    }) 
} 

在这种情况handleResponsegetAllDealers生活在同一类中,但它实际上可以是每个服务可以调用的全局函数。

我认为使用泛型编写一个更好的实现是可能的,但它不会比这个短得多,最终你不能自己创建验证器和解析器并调用下一层。

+0

它工作。谢谢。我犯了很少的语法错误... – vivin