Saltar al contenido

Implemente su primera pantalla en la aplicación iOS

Antes de proceder a aplicar los métodos de delegación y fuente de datos de Vista de tabla, revise y aplique los métodos de carga de datos.

Gracias al servicio de datos generado y las clases de proxy, no es necesario implementar mucho para cargar datos del servicio OData de muestra.

  1. Necesitas un ejemplo de esto ESPMContainer poder acceder a la capa de datos generada. El servicio de datos es accesible en todo el mundo a través de la sesión a bordo. Dependiendo de cómo generó su proyecto Xcode, podría admitir OData Online o Offline. Esto afecta al controlador de OData que usa para recuperar el servicio de datos.

Para OData Online

Agregue la siguiente declaración de importación a su clase:

import SAPOData

Aplique las siguientes líneas de código justo debajo del registrador de casos como propiedades de clase:

/// First retrieve the destinations your app can talk to from the AppParameters.
let destinations = FileConfigurationProvider("AppParameters").provideConfiguration().configuration["Destinations"] as! NSDictionary

/// Create a computed property that uses the OnboardingSessionManager to retrieve the onboarding session and uses the destinations dictionary to pull the correct destination. Of course you only have one destination here. Handle the errors in case the OData controller is nil. You are using the AlertHelper to display an AlertDialogue to the user in case of an error. The AlertHelper is a utils class provided through the iOS Assistant.
var dataService: ESPMContainer<OnlineODataProvider>? {
    guard let odataController = OnboardingSessionManager.shared.onboardingSession?.odataControllers[destinations["com.sap.edm.sampleservice.v2"] as! String] as? Comsapedmsampleservicev2OnlineODataController, let dataService = odataController.espmContainer else {
        AlertHelper.displayAlert(with: NSLocalizedString("OData service is not reachable, please onboard again.", comment: ""), error: nil, viewController: self)
        return nil
    }
    return dataService
}

Para OData sin conexión

Agregue la siguiente declaración de importación a su clase:

import SAPOfflineOData

Aplique las siguientes líneas de código justo debajo del caso del registrador como propiedades de clase:


/// First retrieve the destinations your app can talk to from the AppParameters. let destinations = FileConfigurationProvider("AppParameters").provideConfiguration().configuration["Destinations"] as! NSDictionary var dataService: ESPMContainer<OfflineODataProvider>? { guard let odataController = OnboardingSessionManager.shared.onboardingSession?.odataControllers[destinations["com.sap.edm.sampleservice.v2"] as! String] as? Comsapedmsampleservicev2OfflineODataController, let dataService = odataController.espmContainer else { AlertHelper.displayAlert(with: NSLocalizedString("OData service is not reachable, please onboard again.", comment: ""), error: nil, viewController: self) return nil } return dataService }
  1. Para conseguir clientes disponibles, aplique el siguiente método debajo del soporte final del viewDidLoad() método:


    /** First you define a DataQuery to perform an expand for the customer's sales orders. This data query object you can simply pass into the fetchCustomers(:) method call. Handle the errors and display an Alert Dialogue to the user. Using a DispatchGroup allows us to sequentially run background tasks and perform a certain action as soon as all tasks are completed. First you enter the group and you have to leave the group in any place where you return out of the block. In case you retrieve data from the backend sort the customers by the amount of sales orders they have and set them to the array. */ private func fetchCustomers(_ group: DispatchGroup) { group.enter() let query = DataQuery().expand(Customer.salesOrders) dataService?.fetchCustomers(matching: query) { [weak self] result, error in if let error = error { AlertHelper.displayAlert(with: NSLocalizedString("Failed to load list of customers!", comment: ""), error: error, viewController: self!) self?.logger.error("Failed to load list of customers!", error: error) group.leave() return } // sort the customer result set by the number of available sales orders by customer. self?.customers.append(contentsOf: result!.sorted(by: { $0.salesOrders.count > $1.salesOrders.count })) group.leave() } }
  2. Luego aplica el método responsable de obtener todos los productos. Coloque las siguientes líneas de código debajo del corchete final del fetchCustomers(_:) método:

    /**
    Handle the errors and display an Alert Dialogue to the user.
    
    In case you retrieve data from the backend sort the customers by the amount of sales orders they have and set them to the array.
    */
    private func fetchProducts(_ group: DispatchGroup) {
        group.enter()
    
        dataService?.fetchProducts() { [weak self] result, error in
            if let error = error {
                AlertHelper.displayAlert(with: NSLocalizedString("Failed to load list of products!", comment: ""), error: error, viewController: self!)
                self?.logger.error("Failed to load list of products!", error: error)
                group.leave()
                return
            }
            self?.products.append(contentsOf: result!)
    
            group.leave()
        }
    }
    
    
  3. Ahora juntemos esos dos métodos loadData() método justo encima del fetchCustomers(_:) método.


    /** Show a loading indicator as soon as the method gets called. Create a DispatchGroup and call both fetch methods and pass in the created group. group.notify will be called as soon as both methods called group.leave(). If notify gets called execute the block which will hide the loading indicator, reload the data of the table view. */ private func loadData() { showFioriLoadingIndicator() let group = DispatchGroup() fetchCustomers(group) fetchProducts(group) group.notify(queue: DispatchQueue.main) { self.hideFioriLoadingIndicator() self.tableView.reloadData() } }

    El código no se compilará todavía porque no ha cumplido con la SAPFioriLoadingIndicator protocolo todavía.

  4. Deja el OverviewTableViewController clase de acuerdo con el SAPFioriLoadingIndicator protocolo e implementar la propiedad requerida:

    class OverviewTableViewController: UITableViewController, SAPFioriLoadingIndicator {
        var loadingIndicator: FUILoadingIndicatorView?
    
        //...
    }
    
    
  5. Llama a loadData() método como la última declaración en el viewDidLoad().

Hecho

Inicie sesión para responder la pregunta