Blog!

Busqueda de información

Consumir operaciones CRUD de un Servicio REST/JSON con Swift - Parte 1

Ratio: 4 / 5

Inicio activadoInicio activadoInicio activadoInicio activadoInicio desactivado
 

Uno de los lenguajes de programación que ha estado tomando mayor relevancia en los últimos meses, es el nuevo lenguaje de programación Swift (presentado en el WWDC 2014). En esta serie de artículo revisaremos como generar una aplicación de lista de contactos con swift, en esta primera parte consumiremos las operaciones CRUD de un servicio web RESTful.

Como requisitos para este desarrollo necesitamos:

 

 

- Xcode 6

- Rails 4

- Git (para descargar el código de ejemplo)

- Conocimiento básico de desarrollo de aplicaciones móviles en iOS y Swift

 

El servicio web que consumiremos, es un servicio generado con Rails (por la facilidad de desarrollo que dan los frameworks de tipo scaffolding y que no necesitamos montarlo en servidor de aplicaciones para realizar nuestras pruebas). Para generar el proyecto, en una terminal usamos los siguientes comandos: 

     rails new Agenda

     cd Agenda

     rails g controller Contacto nombre:string telefono:string descripcion:string

 

Con estos tres comandos tenemos tanto un servicio REST/JSON como una página web que nos permiten modificar el elemento Contacto. El código fuente se encuentra en el siguiente link: https://github.com/aguilarzhe/swift_tutorial_server.git 

Para inicializar la tabla SQLite del servicio web y cargar el contenido en ésta, usamos los siguientes comandos:

 

     rake db:migrate 

     rake db:reset

 

Para iniciar el servicio usaremos el comando: 

     rails s -b 0.0.0.0

 

En Xcode, generamos una nueva aplicación Swift para iOS, en la clase de ViewController definimos como atributos el diccionario donde colocaremos los nombres de los contactos junto con su identificador, la tabla donde desplegaremos los nombres de los contactos y el host de nuestro servicio.  

    var contactDictionary: NSMutableDictionary

    var tableView: UITableView

    let host = "http://192.168.1.2:3000"

   

Para la definición de nuestra primer vista, en nuestro viewDidLoad colocamos el botón de Add en la navigationBar, inicializamos nuestro diccionario y la tabla, colocando como delegado y datasource nuestra clase ViewController.

    override func viewDidLoad() {

        super.viewDidLoad()

        // Se coloca título a la vista

        self.title = "Contactos"

       

        // Se agrega un botón + a la barra de título

        self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: nil)

        self.contactDictionary = NSMutableDictionary()

       

        // Se genera la tabla de los contactos

        tableView = UITableView(frame: CGRectMake(0, 10.0, self.view.frame.width, self.view.frame.height))

        tableView.delegate = self

        tableView.dataSource = self

        self.view.addSubview(tableView)

       

        // Se carga el contenido de la tabla

        loadTableView()

    }

 

Para alimentar la información de la tabla, primero debemos de definir que nuestra clase implementara los protocolos necesarios.

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

Posteriormente, definimos los métodos para controlar la tabla, haciendo uso del diccionario como fuente de datos.

    // MARK: UITableViewDelegate

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{

        return contactDictionary.count

    }

   

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{

        var cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)

 

        cell.textLabel?.text = contactDictionary.allValues[indexPath.row] as NSString

        return cell

    }

 

Definimos nuestro primer método para invocar al servicio web, en éste haremos una invocación a la operación índex del recurso contactos para obtener un listado de los contactos disponibles en el servicio y posteriormente los almacenaremos en nuestro diccionario que usamos como fuente de datos para la tabla.

 

    // MARK: Cargar contenido de la tabla

    func loadTableView(){

        var request : NSMutableURLRequest = NSMutableURLRequest()

        request.URL = NSURL(string: (host + "/contactos.json"))

        request.HTTPMethod = "GET"

       

        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in

            var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil

            if let result: NSArray! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSArray {

                // Eliminamos todos los elementos del diccionario

                self.contactDictionary.removeAllObjects()

               

                var id : String, title : String

                let idKey: NSString = "id", idTitle: NSString = "nombre"

               

                // Por cada elemento asignamos el valor de id y título al diccionario

                for contacts in result {

                    id = (contacts as NSDictionary).allValues[1].stringValue

                    title = contacts.allValues[2] as String

                   

                    self.contactDictionary.setValue(title, forKey: id)

                }

               

                // Recargamos la tabla en el hilo principal

                dispatch_async(dispatch_get_main_queue(), { self.tableView.reloadData() })

               

            }

           

        })

    }

Cuando desplegamos el proyecto en un dispositivo, nos da el siguiente resultado:

 

 

Para descargar el proyecto, podemos usar el siguiente link:

https://github.com/aguilarzhe/swift_tutorial_app.git

En la siguiente parte de esta serie de artículos revisaremos como consultar, crear y actualizar un contacto. 

Log in