Универсальный запрос

Запрос может выполняться синхронно и асинхронно:

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

Имя метода Краткое описание
initWithCredentials (_: host: environment: project: device:) Метод выполняет инициализацию фреймворка.
auth (_: password:) Метод выполняет аутентификацию пользователя по логину и паролю.
setDownloadPath(_:) Метод устанавливает путь к папке в директории мобильного приложения, где будут храниться файлы текущего состояния загрузки ресурсов.
useDownload(_:) Метод определяет возобновление загрузки ресурса.

Примечание. В коде приложения используется метод tableStream/tableStreamAsync, для которого определен вспомогательный класс TableCallParams со свойствами retryCount и retryIntervalSec.

request (_: requestCallParams: handler:) Метод отправляет синхронный универсальный запрос к ресурсу без загрузки в базу данных.
requestAsync (_: requestCallParams: handler:) Метод отправляет асинхронный универсальный запрос к ресурсу без загрузки в базу данных.

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

Имя метода Краткое описание
getURL (forFolder:) Метод возвращает URL для папки с заданным именем в папке «Documents».
Тип возвращаемых данных: URL

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

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

Для выполнения примера нажмите кнопку «Perform request». При нажатии на кнопку инициализируется запрос к ресурсу. Сервер мобильной платформы возвращает соответствующие данные.

Код приложения с выполнением синхронного запроса:

import UIKit
 
class ViewController: UIViewController {
 
    // Определим выходные переменные
    @IBOutlet weak var resultTextView: UITextView!
    @IBOutlet weak var requestButton: UIButton!
 
    // Переопределим метод
    override func viewDidLoad() {
        super.viewDidLoad()
        self.deactivateButtons()
        self.initializeFramework()
        self.auth {
            self.activateButton()
            self.resultTextView.text = "Authentication success"
        }
    }
 
    // Зададим метод, который будет выполняться при нажатии на кнопку
    @IBAction func requestPressed(_ sender: UIButton) {
        self.performRequest { (jsonDict) in
            self.resultTextView.text = String(format: "%@", jsonDict)
        }
    }
 
    // Выполним инициализацию фреймворка
    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 = "test"
        let password: String = "test123"
        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")
            }
        }
    }
 
    private func setResumingDownload(_ value: Bool) {
        let path = self.getURL(forFolder: "DownloadPath").path
        HHFWController.sharedInstance().setDownloadPath(path)
        HHFWController.sharedInstance().useDownload(value)
    }
 
    // Выполним запрос Request
    private func performRequest(completion: @escaping (NSDictionary)->()) {
        let resourceName = "FRUITS"
        let requestCallParams = RequestCallParams(defaultProperty: ())
        requestCallParams?.retryCount = 10
        requestCallParams?.retryIntervalSec = 1
        HHFWController.sharedInstance().request(resourceName, requestCallParams: requestCallParams) { (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Request success")
                completion(jsonDict)
            } else {
                print("Request error")
            }
        }
    }
 
    // Зададим методы для отображения элементов пользовательского интерфейса приложения
    private func deactivateButtons() {
        self.requestButton.isEnabled = false
    }
 
    private func activateButton() {
        self.requestButton.isEnabled = true
    }
 
    // Вызовем вспомогательные классы
    private func getURL(forFolder folderName: String) -> URL {
        let paths: [URL] = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let folderURL: URL = paths[0].appendingPathComponent(folderName, isDirectory: true)
        return folderURL
    }
}

Код приложения с выполнением асинхронного запроса:

import UIKit
 
class ViewController: UIViewController {
 
    // Определим выходные переменные
    @IBOutlet weak var resultTextView: UITextView!
    @IBOutlet weak var requestButton: UIButton!
 
    // Переопределим метод
    override func viewDidLoad() {
        super.viewDidLoad()
        self.deactivateButtons()
        self.initializeFramework()
        self.auth {
            self.activateButton()
            self.resultTextView.text = "Authentication success"
        }
    }
 
    // Зададим метод, который будет выполняться при нажатии на кнопку
    @IBAction func requestPressed(_ sender: UIButton) {
        self.performRequest { (jsonDict) in
            self.resultTextView.text = String(format: "%@", jsonDict)
        }
    }
 
    // Выполним инициализацию фреймворка
    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 = "test"
        let password: String = "test123"
        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")
            }
        }
    }
 
    private func setResumingDownload(_ value: Bool) {
        let path = self.getURL(forFolder: "DownloadPath").path
        HHFWController.sharedInstance().setDownloadPath(path)
        HHFWController.sharedInstance().useDownload(value)
    }
 
    // Выполним запрос RequestAsync
    private func performRequest(completion: @escaping (NSDictionary)->()) {
        let resourceName = "FRUITS"
        let requestCallParams = RequestCallParams(defaultProperty: ())
        requestCallParams?.retryCount = 10
        requestCallParams?.retryIntervalSec = 1
        HHFWController.sharedInstance().requestAsync(resourceName, requestCallParams: requestCallParams) { (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Request success")
                completion(jsonDict)
            } else {
                print("Request error")
            }
        }
    }
 
    // Зададим методы для отображения элементов пользовательского интерфейса приложения
    private func deactivateButtons() {
        self.requestButton.isEnabled = false
    }
 
    private func activateButton() {
        self.requestButton.isEnabled = true
    }
 
    // Вызовем вспомогательные классы
    private func getURL(forFolder folderName: String) -> URL {
        let paths: [URL] = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let folderURL: URL = paths[0].appendingPathComponent(folderName, isDirectory: true)
        return folderURL
    }
}

См. также:

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