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