Swift - Как правильно использовать делегат

Я использую Salesforce ios sdk для своего мобильного приложения, и есть метод для выполнения запросов SOQL. Например,

class SfdcController: NSObject, SFRestDelegate {   
    let request = SFRestAPI.sharedInstance().request(forQuery:"SELECT Name FROM User LIMIT 10");
    SFRestAPI.sharedInstance().send(request, delegate: self);

    func request(_ request: SFRestRequest, didLoadResponse jsonResponse: Any)
    {
        print(jsonResponse)
    }

    func request(_ request: SFRestRequest, didFailLoadWithError error: Error)
    {
       self.log(.debug, msg: "didFailLoadWithError: \(error)")
    }
}

Вопрос: Я выполню несколько запросов SOQL в одном классе, и есть разные методы для обработки ответа. Сейчас,

  • Есть ли способ получить ссылку на запрос внутри didLoadResponse? Итак, я могу написать оператор switch для выполнения различных функций.
  • Если не удается повторно использовать делегат, нужно ли создавать несколько классов делегатов для обработки каждого ответа?

Какой лучший способ сделать это?

Обновить

запрос

SFRestRequest 0x1700cb130 
endpoint: /services/data 
method: GET 
path: /v39.0/sobjects/Event/describe 
queryParams: []

Другой способ делегировать это создать отдельный класс и определить его.

SFRestAPI.sharedInstance().send(objectDescribe, delegate: testing());


class testing: NSObject, SFRestDelegate {

    func request(_ request: SFRestRequest, didLoadResponse jsonResponse: Any) {
        print(jsonResponse)
    }
}

Но проблема с вышесказанным, я должен создавать класс каждый раз, когда я хочу выполнить запрос SOQL.

Спасибо

1 ответ

У меня есть идея для вас. Создайте отдельный класс делегата и в этом классе поместите идентификатор. Затем позвольте этому отдельному делегату класса вернуться к вашему контроллеру представления.

// Create a protocol for it
class SFHandlerDelegate {
    func request(_ request: SFRestRequest, handlerId: Int, didLoadResponse jsonResponse: Any)
    func request(_ request: SFRestRequest, handlerId: Int, didFailLoadWithError error: Error)
}

Создать новый класс делегата

// this becomes the SF delegate
class SFHandler : SFRestDelegate {
    var id: Int = 0
    delegate: SFHandlerDelegate
    init(id: Int, delegate: SFHandlerDelegate) { 
        self.id = id 
        self.delegate = delegate
    }

    func request(_ request: SFRestRequest, didLoadResponse jsonResponse: Any)
    {
        delegate.request(request, handlerId: id, didLoadResponse: jsonResponse)
    }

    func request(_ request: SFRestRequest, didFailLoadWithError error: Error)
    {
        delegate.request(request, handlerId: id, didFailLoadWithError: error)
    }

}

Сменить контроллер

class SfdcController: NSObject, SFHandlerDelegate {   
    let request = SFRestAPI.sharedInstance().request(forQuery:"SELECT Name FROM User LIMIT 10");
    let delegate = SFHandlerDelegate(self, 123) // use some handler id
    SFRestAPI.sharedInstance().send(request, delegate: delegate);

    func request(_ request: SFRestRequest, handlerId: Int, didLoadResponse jsonResponse: Any)
    {
        switch handlerId {
            case 123:
                doSomething()
            // whatever
        }
        print(jsonResponse)
    }

    func request(_ request: SFRestRequest, handlerId: Int, didFailLoadWithError error: Error)
    {
         switch handlerId {
            case 123:
                doSomething()
            // whatever
         }
         self.log(.debug, msg: "didFailLoadWithError: \(error)")
    }
}
Другие вопросы по тегам