Offline

Offline

ในคลาสนี้จะใช้ Library จาก SwiftyJSON สำหรับการสร้าง Model ที่ใช้ในการ Sync

LayerOption

Model ของ Condition สำหรับการ Generate Geodatabase

struct LayerOption {
    let layerID: Int
    let whereClause: String
    
    public init(layerID: Int,
                whereClause: String) {
        self.layerID = layerID
        self.whereClause = whereClause
    }
}

Properties

NameDescriptionType
layerIDID ของ Layer ที่ต้องการ Generate GeodatabaseInt
whereClauseWhereClause ของ Layer ที่ต้องการ Generate GeodatabaseString

TransactionType

ประเภทของ Transaction ที่จะทำการ Sync

enum TransactionType: String, Codable {
    case sp = "SP"
    case file = "FILE"
}
NameDescription
spTransaction สำหรับการเรียก Store Procedure
fileTransaction สำหรับการ Upload File

Transaction

Model ของ Transaction ที่จะทำการ Sync โดย Transaction หมายถึง รายการงานของแต่ละใบงาน

struct Transaction<T: Codable>: Codable {
    public var transactionID: Int
    public var transactionType: TransactionType
    public var parameters: T
    
    enum CodingKeys: String, CodingKey {
        case transactionID = "TRANSACTION_ID"
        case transactionType = "TRANSACTION_TYPE"
        case parameters = "PARAMETERS"
    }
    
    public init(transactionID: Int,
                transactionType: TransactionType,
                parameters: T) {
        self.transactionID = transactionID
        self.transactionType = transactionType
        self.parameters = parameters
    }
}

Properties

NameDescriptionType
TClass ของ Parameters ที่จะทำการ SyncClass
transactionIDID ของ Transaction ที่จะทำการ SyncInteger
transactionTypeประเภทของ TransactionTransactionType
parametersParameters ที่จะทำการ SyncT

FileTransaction

Model ของ Transaction ประเภท File ที่จะทำการ Sync

struct FileTransaction: Codable {
    let sourcePath: String
    let sourceFile: String
    let destinationPath: String
    let destinationFile: String
    
    enum CodingKeys: String, CodingKey {
        case sourcePath = "SOURCE_PATH"
        case sourceFile = "SOURCE_FILE"
        case destinationPath = "DESTINATION_PATH"
        case destinationFile = "DESTINATION_FILE"
    }
    
    public init(sourcePath: String, sourceFile: String, destinationPath: String, destinationFile: String) {
        self.sourcePath = sourcePath
        self.sourceFile = sourceFile
        self.destinationPath = destinationPath
        self.destinationFile = destinationFile
    }
}

Properties

NameDescriptionType
sourcePathPath ของไฟล์ที่จะทำการบันทึกString
sourceFileชื่อของไฟล์ที่จะทำการบันทึกString
destinationPathPath ที่จะทำการบันทึกไฟล์String
destinationFileชื่อของไฟล์ใหม่ที่จะทำการบันทึกString

FileData

Model ของ File ที่จะทำการ Sync

struct FileData {
    let data: Data
    let fileName: String
    let fileDirectory: String?
    
    public init(data: Data, fileName: String, fileDirectory: String? = nil) {
        self.data = data
        self.fileName = fileName
        self.fileDirectory = fileDirectory
    }
}

Properties

NameDescriptionType
dataไฟล์ที่ต้องการ SyncData
fileNameชื่อของไฟล์ที่ต้องการ SyncString
fileDirectoryDirectory ของไฟล์ที่ต้องการนำไปวางOptional(String)

Work

Model ของ Work ที่จะทำการ Sync โดย Work หมายถึง ใบงานแต่ละใบงาน

struct Work: Codable {
    public var workID: Int
    public var transactions: [JSON]
    
    enum CodingKeys: String, CodingKey {
        case workID = "WORK_ID"
        case transactions = "TRANSACTIONS"
    }
    
    public init(workID: Int,
                transactions: [JSON]) {
        self.workID = workID
        self.transactions = transactions
    }
}

Properties

NameDescriptionType
workIDID ของ Work ที่จะทำการ SyncInt
transactionsTransaction ทั้งหมดของ Work ที่จะทำการ SyncArray(JSON)

Class Offline

Method Overview

NameDescriptionReturn
generateGeodatabase()การ Generate Geodatabase แล้วบันทึกไว้ในเครื่องvoid
clearGeodatabase()การ Clear Geodatabase ทั้งหมดภายในเครื่องvoid
syncData()การ Sync ข้อมูล MIS ทั้งหมดไปยัง Web Servicevoid
generateWork()การสร้าง Object ของ Work สำหรับการ SyncOptional(Work)
getFeatureLayers()การดึง FeatureLayer ทั้งหมดจาก Geodatabasevoid

Method Details

static func generateGeodatabase(layerOptions layers: [LayerOption],
                                extent: AGSEnvelope,
                                url: URL,
                                nameOfGeodatabase: String = UUID().uuidString,
                                completion: @escaping (Error?, AGSGeodatabase?) -> Void)

การ Generate Geodatabase แล้วบันทึกไว้ในเครื่อง

Parameters

NameDescriptionType
layerOptionsArray ของ Condition สำหรับการ Generate GeodatabaseArray(LayerOption)
extentExtent ของ Layer ที่ต้องการสร้าง GeodatabaseAGSEnvelope
urlURL ของ Map ServiceURL
nameOfGeodatabaseชื่อของ Geodatabase ที่บันทึกString
completionCallback เมื่อสร้าง Geodatabase สำเร็จหรือไม่สำเร็จCompletion
static func clearGeodatabase()

การ Clear Geodatabase ทั้งหมดภายในเครื่อง

static func syncData(works: [Work],
                     files: [FileData] = [],
                     parameters: [String: Any] = [:],
                     userID: String,
                     appFileSource: String = "Default",
                     appFilePath: String = "Sync",
                     completion: @escaping (Error?, [String: Any]?) -> Void)

การ Sync ข้อมูล MIS ทั้งหมดไปยัง Web Service

Parameters

NameDescriptionType
worksWork ทั้งหมดที่ต้องการ SyncArray(Work)
filesFile ทั้งหมดที่ต้องการ SyncArray(FileData)
parametersParameter ที่ต้องการส่งไปยัง Web ServiceDictionary
userIDID ของผู้ใช้งานString
appFileSourceSource ของไฟล์String
appFilePathPath ของไฟล์String
completionCallback เมื่อทำการ Sync ข้อมูลสำเร็จหรือไม่สำเร็จCompletion
static func generateWork(workID: Int, transactions: [Any]) -> Work?

การสร้าง Object ของ Work สำหรับการ Sync

Parameters

NameDescriptionType
workIDID ของใบงานInteger
transactionsรายการงานทั้งหมดของใบงานArray(Any)

Returns

TypeDescription
Optional(Work)Return ใบงาน
static func getFeatureLayers(geodatabase: AGSGeodatabase, completion: @escaping (Error?, [AGSFeatureLayer]?) -> Void)

การดึง FeatureLayer ทั้งหมดจาก Geodatabase

Parameters

NameDescriptionType
geodatabaseGeodatabase ที่ต้องการดึง FeatureLayerAGSGeodatabase
completionCallback เมื่อการดึง FeatureLayer สำเร็จหรือไม่สำเร็จCompletion

Example

<em>// Your Store Procedure Model</em>
struct DataModel: Codable {
    let appDataProcudure: String = "TEST_SYNC_OFFLINE_I"
    let name: String
    let value: String
    
    enum CodingKeys: String, CodingKey {
        case appDataProcudure = "APP_DATA_PROCEDURE"
        case name = "NAME"
        case value = "VALUE"
    }
}

<em>// Initial Your Store Procedure Model</em>
let dataModel = DataModel(name: "Sira", value: "test")
<em>// Initial Transaction for Your Store Procedure Model</em>
let transaction = Transaction(transactionID: 1, 
                              transactionType: .sp, 
                              parameters: dataModel)

<em>// Initial File Transaction Model</em>
let file = FileTransaction(sourcePath: "Sync/Files/work_1", 
                           sourceFile: "Person.jpg", 
                           destinationPath: "Work/work_1", 
                           destinationFile: "Person.jpg")
<em>// Initial Transaction for File</em>
let transactionFile = Transaction(transactionID: 2, 
                                  transactionType: .file, 
                                  parameters: file)

<em>// Get File data for sync</em>
var fileDatas: [FileData] = []
if let image = UIImage(systemName: "person")?.jpgData() {
    let fileData = FileData(data: image, 
                            fileName: "Person.jpg", 
                            fileDirectory: "work_1")
    fileDatas.append(fileData)
}

<em>// Initial Work Model </em>
if let work = Offline.generateWork(workID: 1, transactions: [transaction, transactionFile]) {
    <em>// Sync Data with works, files, userID and parameters</em>
    Offline.syncData(works: [work], files: fileDatas, parameters: [:], userID: "005875") { (error, response) in
        <em>// Callback return response or error</em>
        print(error, response)
    }
}