2016-01-06 4 views
0

Есть две функции, как показано ниже. Большая часть функциональности одинакова для обоих. Его идея состоит в том, чтобы получить выход webservice из getResponse() [Вспомогательный вызов помощника], проанализировать и передать информацию обернутому обратному вызову через 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+ вызовов веб-сервисов, поэтому общее показание, которое я пытаюсь, будет очень полезно.

Следующий шаг, мне также нужно передать функции parseDealerSearchResponse() & parseDealerDetailsResponse() для общей функции.

Я новичок в закрытии. Незлая помощь.

// EDIT - ДОБАВЛЕНИЕ ОБРАЗЕЦ

У меня есть образец для этой проблемы в Git - Приведите класс Layer1.swift https://github.com/vivinjeganathan/ErrorHandling/tree/Closures-Refactor

+0

Обратите внимание, что пример «общей функциональности» не заполнен, пожалуйста, покажите нам свою полную попытку создания этой функции. Несколько иначе: обратите внимание также на то, что 'Void' является просто типом для'() '(пустой tuple _type_ ('() 'также является единственным значением необязательного типа'() ')) и, следовательно,' (getResult:() throws -> Void) -> Void) 'эквивалентно' (getResult:() throws ->()) ->()) '. Даже если нет очевидного соглашения относительно этого, последнее согласуется с тем, что он не смешивает тип и тип данных для этого типа в одном выражении. – dfri

+0

... наконец, функции/замыкания, которые возвращают '()', не должны указывать это явно, так, например, ваш параметр 'wrapperCallback' в сигнатуре' parser' может быть в чуть более компактной форме '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 }) 
    } 
} 

уведомления, что он получает т он парсер, валидатор, закрытие, который фиксирует результат ниже слоя и закрытия заканчивания, которая принадлежит к конечному пользователю (обычно View Controller), а затем эта функция может быть использована следующим образом:

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) 
    }) 
} 

в этот случай handleResponse живет в том же классе с getAllDealers, но на самом деле это может быть глобальная функция, которую могут вызвать все службы.

Я думаю, что было бы возможно написать лучшую реализацию с использованием дженериков, но это было бы не намного короче этого, в конце концов вы не сможете спасти себя от создания валидаторов и парсеров и вызвать следующий уровень.

+0

Работало. Благодарю. Я сделал несколько синтаксических ошибок ... – vivin

Смежные вопросы