Запрос может выполняться синхронно и асинхронно:
Синхронные запросы. Возвращают значения после выполнения метода;
Асинхронные запросы. Не возвращают никакого значения и программа переходит к следующему методу. Ответ приходит по мере готовности.
Для выполнения синхронного или асинхронного универсального запроса к ресурсу без загрузки в базу данных создайте приложение «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»:
«Perform request». Выполнение синхронного или асинхронного запроса к ресурсу без загрузки в базу данных.
Примечание. При загрузке приложения выполняется аутентификация, кнопка недоступна. Если аутентификация выполнена успешно, то кнопка будет доступна и в текстовом поле появится надпись «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-фреймворка | Примеры работы с ресурсами