...
46 org.cocoapods.GCDWebServer 0x0000000106c67316 - Процесс [GCDWebServerConnection (Subclassing )Request: завершение:] + 128
47 org.cocoapods.06x0000000[GCDWebServerConnection _startProcessingRequest] + 146
48 org.cocoapods.GCDWebServer 0x0000000106c64e13 __45- [GCDWebServerConnection _readRequestHeaders] _block_invoke + 1781
49 org.cocoapods.GCDWebServer 0x0000000106c65935 __64- [GCDWebServerConnection (Read) readHeaders:withCompletionBlock:] _ block_invoke + 290
50 org.cocoapods.GCDWebServer 0x0000000106c65613 __68- [GCDWebServerConnection (чтение) readData: withLength: завершениеBlock:] _ _b__invoke_505 * 303 * 053а8 __dispatch_read_block_invoke_252 + 39
* * 52 1 055 libdispatch.dylib 0x00007fff8e72a93d _dispatch_call_block_and_release + 12
53 libdispatch.dylib 0x00007fff8e71f40b _dispatch_client_callout + 8 * +1058 *
54 libdispatch.dylib 0x00007fff8e72329b _dispatch_root_queue_drain + 1890
55 libdispatch.dylib 0x00007fff8e722b00 _dispatch_worker_thread3 + 91
56 libsystem_pthread.dylib 0x00007fff8ea934de _pthread_wqththread1069 *
Это код синглета, который обрабатывает веб-сервер (GCDWebServer).Он считывает сохраненные в памяти данные в соответствии с идентификатором в запросе http
private let queue = DispatchQueue(label: "gcdwebserver_queue")
private func setupServer(){
webServer.delegate = self
webServer.addDefaultHandler(forMethod: "GET", request: GCDWebServerRequest.self) { (req, completion) in
if let resp = self.response(for: req) {
return completion(resp)
}
}
queue.async {
self.webServer.start(withPort: 8521, bonjourName: "GCD Web Server")
}
}
А вот код синглтона, который вызывает соединение Modbus (библиотека C Modbus) (каждые 30 секунд) со списком устройстви читает данные:
private let modbusQueue = DispatchQueue(label: "modbus_queue")
private func initiateTimer() {
polling()
timer?.invalidate()
if #available(OSX 10.12, *) {
timer = Timer.scheduledTimer(withTimeInterval: pollingInterval, repeats: true) { (_) in
self.polling()
}
} else {
timer = Timer.scheduledTimer(timeInterval: pollingInterval, target: self, selector: #selector(polling), userInfo: nil, repeats: true)
}
}
@objc private func polling() {
for device in self.devices {
if !device.isInProcess && device.isEnabled {
self.modbusQueue.async {
self.connectAndReadValues(device: device)
}
}
}
}
private func connectAndReadValues(device: Device) {
device.isInProcess = true
let connect = device.modbus.connect()
//handling connection status
//...
readValues(forDevice: device)
}
private func readValues(forDevice device: Device){
//some constants
do {
let registers = try device.modbus.readRegisters(from: startAddress, count: registersCount)
device.readState = .success
device.modbus.close()
//parse and save data to the app memory just as a dictionary. It saves only one small dictionary per device
parseRegisters(controllerIP: device.modbus.host, vendor: vendor, registers: registers, startAdd: startAddress)
} catch let error {
//handling errors
}
//refreshing interface in the main queue
}