Пример работы с транзакциями

Для работы с транзакциями создайте приложение «HHFWTransactions», в котором используются методы фреймворка:

Имя метода Краткое описание
initWithCredentials (_: host: environment: project: device:) Метод выполняет инициализацию фреймворка.
auth (_: password:) Метод выполняет аутентификацию пользователя по логину и паролю.
table (_: transactionID: tableCallParams: handler:) Метод возвращает табличные данные ресурса без загрузки в базу данных.
retryTable (_: transactionID: tableCallParams: handler:) Метод осуществляет повторный запрос к серверу мобильной платформы для получения сохраненных данных, помеченных ID транзакции.
getAllTransactionResourceName (_: handler:) Метод возвращает список всех транзакций.
getTransaction (_: resourceName: handler:) Метод возвращает ответ с сервера мобильной платформы по ID транзакции.
deleteTransaction (_: resourceName: handler:) Метод удаляет информацию о транзакции.

Вспомогательные методы:

Имя метода Краткое описание
getTransactionIDs (from:) Метод возвращает массив значений для ключа «uuid» из json-результата запроса для получения списка всех транзакций.
Тип возвращаемых данных: [String]
parseServerJSONResponse (json:) Метод возвращает результат преобразования json-словаря «NSDictionary» в словарь «[String: Any]?».
Тип возвращаемых данных: [String: Any]?

Приложение позволяет получать ответы на повторные запросы при разрыве соединения с помощью ID транзакции и без обращения к источнику данных.

Примечание. Используйте передачу транзакционных данных, если не настроено кэширование.

Для получения подробной информации об ID транзакции обратитесь к разделу «Передача транзакционных данных».

Приложение «HHFWTransactions» состоит из одного экрана, текстового представления «UITextView», текстового поля «UITextField» и кнопок «UIButton»:

Примечание. При загрузке приложения выполняется аутентификация, кнопки недоступны. Если аутентификация выполнена успешно, то кнопки будут доступны и в текстовом поле появится надпись «Authentication success».

Для выполнения примера:

  1. Нажмите кнопку «Get all transactions».

При нажатии на кнопку инициализируется запрос списка всех записанных транзакций. Для удобства восприятия в приложении выводится обработанный ответ с сервера мобильной платформы в виде массива ID транзакций.

  1. Нажмите кнопку «Perform request».

При нажатии на кнопку производится запрос без указания ID транзакции.

  1. Нажмите кнопку «Get all transactions» для проверки списка всех транзакций. Список не изменился.

  1. Нажмите кнопку «Perform request with UUID».

При нажатии на кнопку производится запрос с указанием ID транзакции, который генерируется случайным образом и отображается в текстовом поле. К описанию запроса добавился параметр «transactionId».

  1. Нажмите кнопку «Get all transactions» для проверки списка всех транзакций. В списке добавился запрос с ID транзакции.

  1. Нажмите кнопку «Retry request».

При нажатии на кнопку отправляется повторный запрос с указанным ID транзакции на получение ответа, который по каким-либо причинам не был получен, например, при разрыве соединения с сервером мобильной платформы.

Примечание. При нажатии на кнопку «Get transaction» будет получен аналогичный результат.

  1. Введите в текстовое поле ID транзакции «8D8C0F5A-173D-4959-8C9C-2B82DA46982B» для удаления.

  2. Нажмите кнопку «Delete transaction».

При нажатии на кнопку из общего списка транзакций удалится заданная транзакция.

  1. Нажмите кнопку «Get all transactions» для проверки удаления транзакции. В списке транзакций не содержится ранее удаленная транзакция.

Код приложения:

import UIKit
 
class ViewController: UIViewController {
 
    // Определим выходные переменные
    @IBOutlet weak var uuidTextField: UITextField!
    @IBOutlet weak var requestResultTextView: UITextView!
    @IBOutlet weak var requestButton: UIButton!
    @IBOutlet weak var requestWithUUIDButton: UIButton!
    @IBOutlet weak var retryRequestWithUUIDButton: UIButton!
    @IBOutlet weak var getAllTrtansactionButton: UIButton!
    @IBOutlet weak var getTransactionButton: UIButton!
    @IBOutlet weak var deleteTransactionButton: UIButton!
 
    // Переопределим метод
    override func viewDidLoad() {
        super.viewDidLoad()
        self.deactivateButtons()
        self.initializeFramework()
        self.auth {
            self.activateButtons()
            self.requestResultTextView.text = "Authentication success"
        }
    }
 
    // Зададим метод, который будет выполняться при нажатии на кнопку
     @IBAction func viewTapped(_ sender: UITapGestureRecognizer) {
        self.uuidTextField.resignFirstResponder()
    }
 
    @IBAction func requestPressed() {
        self.requestTable { (jsonResult) in
            self.requestResultTextView.text = String(format: "%@", jsonResult)
        }
    }
 
    @IBAction func requestWithUUIDPressed() {
        let uuid = UUID().uuidString
        self.uuidTextField.text = uuid
        self.requestTable(uuid) { (jsonResult) in
            self.requestResultTextView.text = String(format: "%@", jsonResult)
        }
    }
 
    @IBAction func retryPressed() {
        if let uuid = self.uuidTextField.text {
            self.retryRequest(transactionID: uuid) { (jsonResult) in
                self.requestResultTextView.text = String(format: "%@", jsonResult)
            }
        }
    }
 
    @IBAction func getAllTransactionsPressed(_ sender: UIButton) {
        self.getAllTransactions { (jsonResult) in
            self.requestResultTextView.text = String(format: "%@", self.getTransactionIDs(from: jsonResult))
        }
    }
 
    @IBAction func getTransactionPressed(_ sender: UIButton) {
        if let uuid = self.uuidTextField.text {
            self.getTransaction(transactionID: uuid) { (jsonResult) in
                self.requestResultTextView.text = String(format: "%@", jsonResult)
            }
        }
    }
 
    @IBAction func deleteTransactionPressed(_ sender: UIButton) {
        if let uuid = self.uuidTextField.text {
            self.deleteTransaction(transactionID: uuid) { (jsonResult) in
                self.requestResultTextView.text = String(format: "%@", jsonResult)
            }
        }
    }
 
    // Выполним инициализацию фреймворка
    private func initializeFramework() {
        let apiVersion: String = "v1"
        let host: String = "http://testmasterfmp.fsight.cloud/"
        let environment: String = "Leonid_environment"
        let project: String = "Leonid_project"
        let device: String = (UIDevice.current.identifierForVendor?.uuidString)!
        HHFWController.sharedInstance().initWithCredentials(
            apiVersion,
            host: host,
            environment: environment,
            project: project,
            device: device
        )
    }
 
    // Выполним аутентификацию
    private func auth(completion: @escaping ()->()) {
        let username: String = "Leonid"
        let password: String = "123123"
        HHFWController.sharedInstance().auth(username, password: password){ (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Auth success")
                completion()
            } else {
                print("Auth error")
            }
        }
    }
 
    // Выполним запрос Table
    private func requestTable(_ transactionID: String? = nil, completion: @escaping (NSDictionary)->()) {
        let resourceName = "GetBudgetPlanning"
        let tableCallParams = TableCallParams(defaultProperty: ())
        HHFWController.sharedInstance().table(resourceName, transactionID: transactionID, tableCallParams: tableCallParams) { (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Table request success")
                completion(jsonDict)
            } else {
                print("Table request error")
            }
        }
    }
 
    // Выполним запрос RetryTable
    private func retryRequest(transactionID: String, completion: @escaping (NSDictionary)->()) {
        let resourceName = "GetBudgetPlanning"
        let tableCallParams = TableCallParams(defaultProperty: ())
        HHFWController.sharedInstance().retryTable(resourceName, transactionID: transactionID, tableCallParams: tableCallParams) { (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Retry table request success")
                completion(jsonDict)
            } else {
                print("Retry table request error")
            }
        }
    }
 
    // Получим список транзакций
    private func getAllTransactions(completion: @escaping (NSDictionary)->()) {
        let resourceName = "GetBudgetPlanning"
        HHFWController.sharedInstance().getAllTransactionResourceName(resourceName) { (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Get all transactions success")
                completion(jsonDict)
            } else {
                print("Get all transactions error")
            }
        }
    }
 
    // Получим определенную транзакцию
    private func getTransaction(transactionID: String, completion: @escaping (NSDictionary)->()) {
        let resourceName = "GetBudgetPlanning"
        HHFWController.sharedInstance().getTransaction(transactionID, resourceName: resourceName) { (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Get transaction success")
                completion(jsonDict)
            } else {
                print("Get transaction error")
            }
        }
    }
 
    // Удалим определенную транзакцию
    private func deleteTransaction(transactionID: String, completion: @escaping (NSDictionary)->()) {
        let resourceName = "GetBudgetPlanning"
        HHFWController.sharedInstance().deleteTransaction(transactionID, resourceName: resourceName) { (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Delete transaction success")
                completion(jsonDict)
            } else {
                print("Delete transaction error")
            }
        }
    }
 
    // Вызовем вспомогательные классы
    private func getTransactionIDs(from json: NSDictionary) -> [String] {
        var transactionIDs: [String] = []
        if let jsonDict = self.parseServerJSONResponse(json: json),
            let result = jsonDict["result"] as? [String: Any],
            let transactions = result["raw"] as? [[String: Any]] {
            for transaction in transactions {
                if let transactionID = transaction["uuid"] as? String {
                    transactionIDs.append(transactionID)
                }
            }
        }
        return transactionIDs
    }
 
    func parseServerJSONResponse(json: NSDictionary) -> [String: Any]? {
        return json as? [String: Any]
    }
 
    // Зададим методы для отображения элементов пользовательского интерфейса приложения
    private func deactivateButtons() {
        self.requestButton.isEnabled = false
        self.requestWithUUIDButton.isEnabled = false
        self.retryRequestWithUUIDButton.isEnabled = false
        self.getAllTrtansactionButton.isEnabled = false
        self.getTransactionButton.isEnabled = false
        self.deleteTransactionButton.isEnabled = false
    }
 
    private func activateButtons() {
        self.requestButton.isEnabled = true
        self.requestWithUUIDButton.isEnabled = true
        self.retryRequestWithUUIDButton.isEnabled = true
        self.getAllTrtansactionButton.isEnabled = true
        self.getTransactionButton.isEnabled = true
        self.deleteTransactionButton.isEnabled = true
    }
}

См. также:

Примеры использования iOS-фреймворка