2016-07-20 1 views
2

друзья !, Я новичок в 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 
    } 

} 
  1. RestClient.swift - Сделать запрос API и передать вывод JSON. Этот класс содержит весь код, связанный с сетью Запросы GET/POST. Я могу изменить этот класс в будущем, не затрагивая другие классы.
  2. HttpUser.swift - Получить выход json, сделать массив пользователей и передать его. Этот класс не заботится о сетевых запросах. Это будет обрабатывать ответ JSON и анализировать его в массив объектов. У меня будет несколько из них. (например: HttpBlogs, HttpComments)
  3. UserViewController.swift - Получить массив пользователей и заполнить представление таблицы. Это будет обрабатывать только разделов, связанных с UI.

Можете ли вы сказать мне, что этот подход хорош, чтобы следовать? Есть ли лучший способ достичь этого?

Спасибо большое всем!

-Пожалуйста, обратите внимание: я не хочу использовать сторонние библиотеки, такие как Alamofire.

+1

Я новичок в разработке iOS, но, на мой взгляд, ваш подход очень хорош. Фактически я придумал тот же подход при разработке моего первого проекта и с тех пор довольно доволен его использованием повсюду. Немного совет - объявите переменные делегата как слабые переменные. – Elena

+0

Спасибо! Сегодня я пробовал этот код в своем приложении. это кажется довольно чистым. :П –

ответ

1

В целом, это хороший подход. Возможно, вам захочется подумать о том, чтобы отображать ошибки (например: нет подключения к Интернету) в пользовательском интерфейсе для лучшего удобства пользователей. В вашем примере вы обрабатываете свои ошибки в классе RestClient, но в случае возникновения каких-либо ошибок он не восходит к классу UserViewController для обработки в пользовательском интерфейсе.

Я нашел это сообщение, объяснив, как писать вашу собственную сетевую библиотеку в деталях. http://ilya.puchka.me/networking-in-swift/