From f3e2f341049c49fd1d45f66df1cfd9db2bfd5b91 Mon Sep 17 00:00:00 2001 From: masakih Date: Sat, 18 Feb 2017 22:36:34 +0900 Subject: [PATCH] =?utf8?q?HMJSONCommand=E3=82=92=E6=95=B4=E7=90=86?= =?utf8?q?=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- KCD/CommandRegister.swift | 129 +++++++++++++++++++++++++++++--------------- KCD/HMJSONCommand.swift | 70 ++++-------------------- KCD/HMJSONTracker.swift | 2 +- KCD/HMJSONViewCommand.swift | 4 ++ 4 files changed, 101 insertions(+), 104 deletions(-) diff --git a/KCD/CommandRegister.swift b/KCD/CommandRegister.swift index 266f798b..9250048d 100644 --- a/KCD/CommandRegister.swift +++ b/KCD/CommandRegister.swift @@ -8,49 +8,92 @@ import Cocoa -class CommandRegister: NSObject { +class CommandRegister { + + private static var registeredClasses: [HMJSONCommand.Type] = [] class func register() { - HMJSONCommand.registerClass(HMStart2Command.self) - HMJSONCommand.registerClass(HMMemberNDockCommand.self) - HMJSONCommand.registerClass(HMMemberKDockCommand.self) - HMJSONCommand.registerClass(HMMemberDeckCommand.self) - HMJSONCommand.registerClass(HMMemberMaterialCommand.self) - HMJSONCommand.registerClass(HMMemberBasicCommand.self) - HMJSONCommand.registerClass(HMMemberShipCommand.self) - HMJSONCommand.registerClass(HMMemberSlotItemCommand.self) - HMJSONCommand.registerClass(HMMemberShip2Command.self) - HMJSONCommand.registerClass(HMMemberShip3Command.self) - HMJSONCommand.registerClass(HMMemberRequireInfoCommand.self) - HMJSONCommand.registerClass(HMCreateShipCommand.self) - HMJSONCommand.registerClass(HMDestroyItem2Command.self) - HMJSONCommand.registerClass(HMMapStartCommand.self) - HMJSONCommand.registerClass(HMBattleCommand.self) - HMJSONCommand.registerClass(HMMidnightBattleCommand.self) - HMJSONCommand.registerClass(HMBattleResultCommand.self) - HMJSONCommand.registerClass(HMCombinedBattleCommand.self) - HMJSONCommand.registerClass(HMAirBattleCommand.self) - HMJSONCommand.registerClass(HMGuardShelterCommand.self) - HMJSONCommand.registerClass(HMMapInfoCommand.self) - HMJSONCommand.registerClass(HMSetPlaneCommand.self) - HMJSONCommand.registerClass(HMSetActionCommand.self) - HMJSONCommand.registerClass(HMCreateSlotItemCommand.self) - HMJSONCommand.registerClass(HMGetShipCommand.self) - HMJSONCommand.registerClass(HMDestroyShipCommand.self) - HMJSONCommand.registerClass(HMPowerUpCommand.self) - HMJSONCommand.registerClass(HMRemodelSlotCommand.self) - HMJSONCommand.registerClass(HMShipDeckCommand.self) - HMJSONCommand.registerClass(HMChangeHenseiCommand.self) - HMJSONCommand.registerClass(HMKaisouLockCommand.self) - HMJSONCommand.registerClass(HMSlotResetCommand.self) - HMJSONCommand.registerClass(HMCombinedCommand.self) - HMJSONCommand.registerClass(HMSlotDepriveCommand.self) - HMJSONCommand.registerClass(HMQuestListCommand.self) - HMJSONCommand.registerClass(HMClearItemGetComand.self) - HMJSONCommand.registerClass(HMNyukyoStartCommand.self) - HMJSONCommand.registerClass(HMHokyuChargeCommand.self) - HMJSONCommand.registerClass(HMNyukyoSpeedChangeCommand.self) - HMJSONCommand.registerClass(HMPortCommand.self) - HMJSONCommand.registerClass(HMAirCorpsSupplyCommand.self) - HMJSONCommand.registerClass(HMAirCorpsChangeNameCommand.self) + registerClass(HMStart2Command.self) + registerClass(HMMemberNDockCommand.self) + registerClass(HMMemberKDockCommand.self) + registerClass(HMMemberDeckCommand.self) + registerClass(HMMemberMaterialCommand.self) + registerClass(HMMemberBasicCommand.self) + registerClass(HMMemberShipCommand.self) + registerClass(HMMemberSlotItemCommand.self) + registerClass(HMMemberShip2Command.self) + registerClass(HMMemberShip3Command.self) + registerClass(HMMemberRequireInfoCommand.self) + registerClass(HMCreateShipCommand.self) + registerClass(HMDestroyItem2Command.self) + registerClass(HMMapStartCommand.self) + registerClass(HMBattleCommand.self) + registerClass(HMMidnightBattleCommand.self) + registerClass(HMBattleResultCommand.self) + registerClass(HMCombinedBattleCommand.self) + registerClass(HMAirBattleCommand.self) + registerClass(HMGuardShelterCommand.self) + registerClass(HMMapInfoCommand.self) + registerClass(HMSetPlaneCommand.self) + registerClass(HMSetActionCommand.self) + registerClass(HMCreateSlotItemCommand.self) + registerClass(HMGetShipCommand.self) + registerClass(HMDestroyShipCommand.self) + registerClass(HMPowerUpCommand.self) + registerClass(HMRemodelSlotCommand.self) + registerClass(HMShipDeckCommand.self) + registerClass(HMChangeHenseiCommand.self) + registerClass(HMKaisouLockCommand.self) + registerClass(HMSlotResetCommand.self) + registerClass(HMCombinedCommand.self) + registerClass(HMSlotDepriveCommand.self) + registerClass(HMQuestListCommand.self) + registerClass(HMClearItemGetComand.self) + registerClass(HMNyukyoStartCommand.self) + registerClass(HMHokyuChargeCommand.self) + registerClass(HMNyukyoSpeedChangeCommand.self) + registerClass(HMPortCommand.self) + registerClass(HMAirCorpsSupplyCommand.self) + registerClass(HMAirCorpsChangeNameCommand.self) + } + + class func command(for response: HMAPIResponse) throws -> HMJSONCommand { + var command: HMJSONCommand? = nil + if !response.success { + command = HMFailedCommand(apiResponse: response) + } + for c in registeredClasses { + if c.canExecuteAPI(response.api) { + command = c.init(apiResponse: response) + break + } + } + + if command == nil { + if HMIgnoreCommand.canExecuteAPI(response.api) { + command = HMIgnoreCommand(apiResponse: response) + } + } + if command == nil { + command = HMUnknownComand(apiResponse: response) + } + + guard var validCommand = command + else { throw JSONCommandError.CanNotFindCommand } + + #if ENABLE_JSON_LOG + let viewCommand = HMJSONViewCommand(apiResponse: response) + viewCommand.parameterList = response.argumentArray + if let j = HMJSONNode.nodeWithJSON(response.json as AnyObject?) { + viewCommand.jsonTree = [j] + } + viewCommand.recieveDate = response.date + validCommand = HMCompositCommand(apiResponse: response, commandList: [validCommand, viewCommand]) + #endif + + return validCommand + } + class func registerClass(_ commandClass: HMJSONCommand.Type) { + if registeredClasses.contains(where: { $0 == commandClass }) { return } + registeredClasses.append(commandClass) } } diff --git a/KCD/HMJSONCommand.swift b/KCD/HMJSONCommand.swift index 7d8e29e7..d6c218f3 100644 --- a/KCD/HMJSONCommand.swift +++ b/KCD/HMJSONCommand.swift @@ -12,69 +12,18 @@ enum JSONCommandError: Error { case CanNotFindCommand } -class HMJSONCommand: NSObject { +class HMJSONCommand { + class func canExecuteAPI(_ api: String) -> Bool { return false } required init(apiResponse: HMAPIResponse) { api = apiResponse.api arguments = apiResponse.parameter json = apiResponse.json - super.init() } - class func command(for response: HMAPIResponse) throws -> HMJSONCommand { - var command: HMJSONCommand? = nil - if !response.success { - command = HMFailedCommand(apiResponse: response) - } - for c in registeredClasses { - if c.canExecuteAPI(response.api) { - command = c.init(apiResponse: response) - break - } - } - - if command == nil { - if HMIgnoreCommand.canExecuteAPI(response.api) { - command = HMIgnoreCommand(apiResponse: response) - } - } - if command == nil { - command = HMUnknownComand(apiResponse: response) - } - - guard var validCommand = command - else { throw JSONCommandError.CanNotFindCommand } - - #if ENABLE_JSON_LOG - let viewCommand = HMJSONViewCommand(apiResponse: response) - viewCommand.parameterList = response.argumentArray - if let j = HMJSONNode.nodeWithJSON(response.json as AnyObject?) { - viewCommand.jsonTree = [j] - } - viewCommand.recieveDate = response.date - validCommand = HMCompositCommand(apiResponse: response, commandList: [validCommand, viewCommand]) - #endif - - return validCommand - } - class func registerClass(_ commandClass: HMJSONCommand.Type) { - if registeredClasses.contains(where: { $0 == commandClass }) { return } - registeredClasses.append(commandClass) - } - class func canExecuteAPI(_ api: String) -> Bool { - return false - } - private static var registeredClasses: [HMJSONCommand.Type] = [] - let api: String let arguments: [String:String] let json: [String:Any] - #if ENABLE_JSON_LOG - var jsonTree: [Any]? = [] - var parameterList: [Any] = [] - var recieveDate: Date? = nil - #endif - var dataKey: String { return "api_data" } var primaryKey: String { return "id" } var compositPrimaryKeys: [String]? { return nil } @@ -127,15 +76,16 @@ class HMJSONCommand: NSObject { func objectSearch(_ objects: [NSManagedObject], _ element: [String:Any]) -> NSManagedObject? { let keys = self.compositPrimaryKeys ?? [self.primaryKey] let keyPiar = keys.map { (key: $0, apiKey: "api_\($0)") } - let o = objects.filter { (obj: NSManagedObject) -> Bool in + return objects.binarySearch { for piar in keyPiar { - guard let v1 = obj.value(forKey: piar.key) else { return false } - guard let v2 = element[piar.apiKey] else { return false } - return (v1 as AnyObject).compare(v2) == .orderedSame + guard let v1 = $0.value(forKey: piar.key) + else { return .orderedAscending } + guard let v2 = element[piar.apiKey] + else { return .orderedDescending } + return (v1 as AnyObject).compare(v2) } - return false + return .orderedDescending } - return o.first } func commitJSON(toEntityNamed entityName: String) { guard var d = (json as AnyObject).value(forKeyPath: dataKey) @@ -145,7 +95,7 @@ class HMJSONCommand: NSObject { else { return print("JSON is wrong.") } let store = editorStore; - guard let objects = try? store.objects(withEntityName: entityName, sortDescriptors: nil) + guard let objects = try? store.objects(withEntityName: entityName, sortDescriptors: sortDescriptors) else { return print("Can not get entity named \(entityName)") } data.forEach { if let object = objectSearch(objects, $0) { diff --git a/KCD/HMJSONTracker.swift b/KCD/HMJSONTracker.swift index ed20fed1..8eeda204 100644 --- a/KCD/HMJSONTracker.swift +++ b/KCD/HMJSONTracker.swift @@ -26,7 +26,7 @@ class HMJSONTracker: NSObject { guard let item = queue.dequeue() as? HMAPIResponse else { return print("Dequeued item is not HMAPIResponse") } do { - try HMJSONCommand.command(for: item).execute() + try CommandRegister.command(for: item).execute() } catch { print("HMJSONTracker Cought Exception -> \(error)") diff --git a/KCD/HMJSONViewCommand.swift b/KCD/HMJSONViewCommand.swift index 88d04cad..87485da5 100644 --- a/KCD/HMJSONViewCommand.swift +++ b/KCD/HMJSONViewCommand.swift @@ -11,6 +11,10 @@ import Cocoa #if ENABLE_JSON_LOG class HMJSONViewCommand: HMJSONCommand { + var jsonTree: [Any]? = [] + var parameterList: [Any] = [] + var recieveDate: Date? = nil + override func execute() { guard let _ = jsonTree else { return print("jsonTree is nil.") } guard let _ = recieveDate else { return print("recieveDate is nil.") } -- 2.11.0