друзья !, Я новичок в Swift. Мне нужно сделать несколько запросов API в одном из моих контроллеров. Если я поместил весь код в ViewController, это будет беспорядочно. Итак, я пытаюсь разработать эту простую архитектуру для разделения концепций, но я не уверен, что это лучший подход для обработки этой ситуации.Swift: отдельные классы для сетевых запросов
/*-----------------------------------------------------*/
/* RestClient.swift */
/*-----------------------------------------------------*/
protocol RestClientDelegate {
func dataDidLoad(json:String)
}
class RestClient {
var delegate:RestClientDelegate
//Handles all the network codes and exceptions
func makeGetRequest(url){
//send a get request to the server
//on error - handle erros
//on success - pass Json response to HttpUser class
delegate.dataDidLoad(jsonOutput)
}
}
/*-----------------------------------------------------*/
/* HttpUser.swift */
/*-----------------------------------------------------*/
protocol UserDelegate(){
func usersDidLoad(usersArray:[User])//User object array
}
class HttpUser, RestClientDelegate {
var delegate:UserDelegate
func getUsers(){
//Use rest client to make an api call
var client = RestClient()
client.delegate = self
client.makeGetRequest("www.example.com/users")
}
//Once RestClient get the json string output, it will pass to
//this function
func dataDidLoad(json:String){
//parse json - Handles json exceptions
//populate user objects in an array
//pass user array to the ViewController
delegate.usersDidLoad(usersArray:[User])
}
}
/*-----------------------------------------------------*/
/* UserViewController.swift */
/*-----------------------------------------------------*/
class UserViewController:UIViewController, UserDelegate {
override viewDidLoad(){
super.viewDidLoad()
//Ask http user class to retrieve users
var httpUser = HttpUser()
httpUser.delegate = self
httpUser.getUsers()
}
//Callback function to get users array
func usersDidLoad(usersArray:[User]) {
//now you have users object array
//populate a table view
}
}
- RestClient.swift - Сделать запрос API и передать вывод JSON. Этот класс содержит весь код, связанный с сетью Запросы GET/POST. Я могу изменить этот класс в будущем, не затрагивая другие классы.
- HttpUser.swift - Получить выход json, сделать массив пользователей и передать его. Этот класс не заботится о сетевых запросах. Это будет обрабатывать ответ JSON и анализировать его в массив объектов. У меня будет несколько из них. (например: HttpBlogs, HttpComments)
- UserViewController.swift - Получить массив пользователей и заполнить представление таблицы. Это будет обрабатывать только разделов, связанных с UI.
Можете ли вы сказать мне, что этот подход хорош, чтобы следовать? Есть ли лучший способ достичь этого?
Спасибо большое всем!
-Пожалуйста, обратите внимание: я не хочу использовать сторонние библиотеки, такие как Alamofire.
Я новичок в разработке iOS, но, на мой взгляд, ваш подход очень хорош. Фактически я придумал тот же подход при разработке моего первого проекта и с тех пор довольно доволен его использованием повсюду. Немного совет - объявите переменные делегата как слабые переменные. – Elena
Спасибо! Сегодня я пробовал этот код в своем приложении. это кажется довольно чистым. :П –