Фреймворк FMPWrapper

FMPWrapper - фреймворк, написанный на Swift на основе HHFW. В этом блоке уже более объектно-ориентированный подход. Тем не менее при работе с ним необходимо иметь ввиду, что в основе лежит синглтон из HHFW. FMPWrapper не обязателен к использованию, так как является оберткой для HHFW, однако он упрощает работу с кодом за счет своей архитектуры.

FMPWrapper содержит:

Основным рабочим элементом является объект класса FMPFactory, который является фабрикой для инициализации строителей для всех используемых классов.

// Инициализация фабрики
let fmp = FMPFactory()
  
// Инициализация строителя для объекта, описывающего локальную БД
let databaseBuilder: FMPDatabase.Builder = fmp.database
  
// Построение и инициализация объекта, описывающего локальную БД
let database: FMPDatabase = databaseBuilder
    .path(databasePath)
    .key(key)
    .build()
  
// Вызов метода объекта
database.open()

Методы FMPWrapper возвращают данные в обработанном виде (объекты).

В случае запросов на сервер, по окончанию так же вызывается замыкание, но уже типа FMPRequestResponseHandler (или иной в зависимости от метода). В этом замыкании аргументом является кортеж, в котором первыми двумя параметрами являются статус запроса Bool и опциональная ошибка FMPError?. Они представлены в более удобном виде, поэтому могут быть обработаны в коде без дополнительных усилий со стороны разработчика. Третьим параметром замыкания является результат запроса. Он может быть как словарем с данными NSDictionary, так и объектом или массивом объектов (это зависит от метода).

let file: FMPFile = FMPFactory().file.build()
  
// typealias FMPRequestResponse = (success: Bool, error: FMPError?, result: NSDictionary?)
// typealias FMPRequestResponseHandler = (_ response: FMPRequestResponse) -> Void
file.download { (response) in
    if response.success {
        // Hurray!
    } else {
        print(response.error?.description)
    }
}
  
// typealias FMPFileMetaHandler = (_ success: Bool, _ error: FMPError?, _ meta: FMPFile.Meta?) -> Void
file.loadMeta { (success, error, result) in
    if success {
        print(meta?.size)
    }
}

См. также:

Классы | Перечисления | Псевдонимы типов