From a58c5d894b4fba62f97a86ce44e220fd11c326e0 Mon Sep 17 00:00:00 2001 From: Blake McAnally Date: Fri, 28 Jun 2024 08:50:49 -0500 Subject: [PATCH] Refactor fetch requests to use the EntityName.fetchRequest() API to prevent unnecessary branching --- Meshtastic/Helpers/BLEManager.swift | 36 ++--- Meshtastic/Helpers/MeshPackets.swift | 113 ++++++-------- Meshtastic/Persistence/QueryCoreData.swift | 30 ++-- Meshtastic/Persistence/UpdateCoreData.swift | 156 ++++++-------------- Meshtastic/Views/Bluetooth/Connect.swift | 6 +- Meshtastic/Views/Messages/Messages.swift | 6 +- 6 files changed, 122 insertions(+), 225 deletions(-) diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index caab235d..030a8eca 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -426,12 +426,10 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate success = true let traceRoute = TraceRouteEntity(context: context!) - let nodes: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let nodes = NodeInfoEntity.fetchRequest() nodes.predicate = NSPredicate(format: "num IN %@", [destNum, self.connectedPeripheral.num]) do { - guard let fetchedNodes = try context!.fetch(nodes) as? [NodeInfoEntity] else { - return false - } + let fetchedNodes = try context!.fetch(nodes) let receivingNode = fetchedNodes.first(where: { $0.num == destNum }) let connectedNode = fetchedNodes.first(where: { $0.num == self.connectedPeripheral.num }) traceRoute.id = Int64(meshPacket.id) @@ -756,10 +754,10 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate /// MQTT Client Proxy and RangeTest and Store and Forward interest if connectedPeripheral.num > 0 { - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(connectedPeripheral.num)) do { - let fetchedNodeInfo = try context?.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] ?? [] + let fetchedNodeInfo = try context?.fetch(fetchNodeInfoRequest) ?? [] if fetchedNodeInfo.count == 1 { // Subscribe to Mqtt Client Proxy if enabled if fetchedNodeInfo[0].mqttConfig != nil && fetchedNodeInfo[0].mqttConfig?.enabled ?? false && fetchedNodeInfo[0].mqttConfig?.proxyToClientEnabled ?? false { @@ -839,24 +837,22 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate success = false } else { - + guard let context else { return false } let fromUserNum: Int64 = self.connectedPeripheral.num - let messageUsers: NSFetchRequest = NSFetchRequest.init(entityName: "UserEntity") + let messageUsers = UserEntity.fetchRequest() messageUsers.predicate = NSPredicate(format: "num IN %@", [fromUserNum, Int64(toUserNum)]) do { - guard let fetchedUsers = try context?.fetch(messageUsers) as? [UserEntity] else { - return false - } + let fetchedUsers = try context.fetch(messageUsers) if fetchedUsers.isEmpty { Logger.data.error("đŸšĢ Message Users Not Found, Fail") success = false } else if fetchedUsers.count >= 1 { - let newMessage = MessageEntity(context: context!) + let newMessage = MessageEntity(context: context) newMessage.messageId = Int64(UInt32.random(in: UInt32(UInt8.max).. = NSFetchRequest.init(entityName: "MyInfoEntity") + let fetchMyInfoRequest = MyInfoEntity.fetchRequest() fetchMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", Int64(connectedPeripheral.num)) do { - let fetchedMyInfo = try context?.fetch(fetchMyInfoRequest) as? [MyInfoEntity] ?? [] + let fetchedMyInfo = try context?.fetch(fetchMyInfoRequest) ?? [] if fetchedMyInfo.count == 1 { i = Int32(fetchedMyInfo[0].channels?.count ?? -1) myInfo = fetchedMyInfo[0] @@ -2960,18 +2955,19 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } public func tryClearExistingChannels() { + guard let context else { return } // Before we get started delete the existing channels from the myNodeInfo - let fetchMyInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MyInfoEntity") + let fetchMyInfoRequest = MyInfoEntity.fetchRequest() fetchMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", Int64(connectedPeripheral.num)) do { - let fetchedMyInfo = try context?.fetch(fetchMyInfoRequest) as? [MyInfoEntity] ?? [] + let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) if fetchedMyInfo.count == 1 { let mutableChannels = fetchedMyInfo[0].channels?.mutableCopy() as? NSMutableOrderedSet mutableChannels?.removeAllObjects() fetchedMyInfo[0].channels = mutableChannels do { - try context!.save() + try context.save() } catch { Logger.data.error("Failed to clear existing channels from local app database: \(error.localizedDescription)") } diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index 3250334b..dc86a725 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -96,13 +96,11 @@ func myInfoPacket (myInfo: MyNodeInfo, peripheralId: String, context: NSManagedO let logString = String.localizedStringWithFormat("mesh.log.myinfo %@".localized, String(myInfo.myNodeNum)) MeshLogger.log("â„šī¸ \(logString)") - let fetchMyInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MyInfoEntity") + let fetchMyInfoRequest = MyInfoEntity.fetchRequest() fetchMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", Int64(myInfo.myNodeNum)) do { - guard let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) as? [MyInfoEntity] else { - return nil - } + let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) // Not Found Insert if fetchedMyInfo.isEmpty { @@ -148,13 +146,11 @@ func channelPacket (channel: Channel, fromNum: Int64, context: NSManagedObjectCo let logString = String.localizedStringWithFormat("mesh.log.channel.received %d %@".localized, channel.index, String(fromNum)) MeshLogger.log("đŸŽ›ī¸ \(logString)") - let fetchedMyInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MyInfoEntity") + let fetchedMyInfoRequest = MyInfoEntity.fetchRequest() fetchedMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", fromNum) do { - guard let fetchedMyInfo = try context.fetch(fetchedMyInfoRequest) as? [MyInfoEntity] else { - return - } + let fetchedMyInfo = try context.fetch(fetchedMyInfoRequest) if fetchedMyInfo.count == 1 { let newChannel = ChannelEntity(context: context) newChannel.id = Int32(channel.index) @@ -205,13 +201,11 @@ func deviceMetadataPacket (metadata: DeviceMetadata, fromNum: Int64, context: NS let logString = String.localizedStringWithFormat("mesh.log.device.metadata.received %@".localized, String(fromNum)) MeshLogger.log("đŸˇī¸ \(logString)") - let fetchedNodeRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchedNodeRequest = NodeInfoEntity.fetchRequest() fetchedNodeRequest.predicate = NSPredicate(format: "num == %lld", fromNum) do { - guard let fetchedNode = try context.fetch(fetchedNodeRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchedNodeRequest) let newMetadata = DeviceMetadataEntity(context: context) newMetadata.time = Date() newMetadata.deviceStateVersion = Int32(metadata.deviceStateVersion) @@ -256,13 +250,11 @@ func nodeInfoPacket (nodeInfo: NodeInfo, channel: UInt32, context: NSManagedObje guard nodeInfo.num > 0 else { return nil } - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeInfo.num)) do { - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return nil - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Not Found Insert if fetchedNode.isEmpty && nodeInfo.num > 0 { @@ -319,13 +311,11 @@ func nodeInfoPacket (nodeInfo: NodeInfo, channel: UInt32, context: NSManagedObje } // Look for a MyInfo - let fetchMyInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MyInfoEntity") + let fetchMyInfoRequest = MyInfoEntity.fetchRequest() fetchMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", Int64(nodeInfo.num)) do { - guard let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) as? [MyInfoEntity] else { - return nil - } + let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) if fetchedMyInfo.count > 0 { newNode.myInfo = fetchedMyInfo[0] } @@ -403,13 +393,11 @@ func nodeInfoPacket (nodeInfo: NodeInfo, channel: UInt32, context: NSManagedObje } // Look for a MyInfo - let fetchMyInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MyInfoEntity") + let fetchMyInfoRequest = MyInfoEntity.fetchRequest() fetchMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", Int64(nodeInfo.num)) do { - guard let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) as? [MyInfoEntity] else { - return nil - } + let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) if fetchedMyInfo.count > 0 { fetchedNode[0].myInfo = fetchedMyInfo[0] } @@ -445,13 +433,11 @@ func adminAppPacket (packet: MeshPacket, context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.cannedmessages.messages.received %@".localized, String(packet.from)) MeshLogger.log("đŸĨĢ \(logString)") - let fetchNodeRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeRequest = NodeInfoEntity.fetchRequest() fetchNodeRequest.predicate = NSPredicate(format: "num == %lld", Int64(packet.from)) do { - guard let fetchedNode = try context.fetch(fetchNodeRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeRequest) if fetchedNode.count == 1 { let messages = String(cmmc.textFormatString()) .replacingOccurrences(of: "11: ", with: "") @@ -527,12 +513,10 @@ func adminAppPacket (packet: MeshPacket, context: NSManagedObjectContext) { func adminResponseAck (packet: MeshPacket, context: NSManagedObjectContext) { - let fetchedAdminMessageRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MessageEntity") + let fetchedAdminMessageRequest = MessageEntity.fetchRequest() fetchedAdminMessageRequest.predicate = NSPredicate(format: "messageId == %lld", packet.decoded.requestID) do { - guard let fetchedMessage = try context.fetch(fetchedAdminMessageRequest) as? [MessageEntity] else { - return - } + let fetchedMessage = try context.fetch(fetchedAdminMessageRequest) if fetchedMessage.count > 0 { fetchedMessage[0].ackTimestamp = Int32(Date().timeIntervalSince1970) fetchedMessage[0].ackError = Int32(RoutingError.none.rawValue) @@ -557,11 +541,11 @@ func paxCounterPacket (packet: MeshPacket, context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.paxcounter %@".localized, String(packet.from)) MeshLogger.log("🧑‍🤝‍🧑 \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(packet.from)) do { - let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] + let fetchedNode = try context.fetch(fetchNodeInfoRequest) if let paxMessage = try? Paxcount(serializedData: packet.decoded.payload) { @@ -571,12 +555,12 @@ func paxCounterPacket (packet: MeshPacket, context: NSManagedObjectContext) { newPax.uptime = Int32(truncatingIfNeeded: paxMessage.uptime) newPax.time = Date() - if fetchedNode?.count ?? 0 > 0 { - guard let mutablePax = fetchedNode?[0].pax!.mutableCopy() as? NSMutableOrderedSet else { + if fetchedNode.count > 0 { + guard let mutablePax = fetchedNode[0].pax!.mutableCopy() as? NSMutableOrderedSet else { return } mutablePax.add(newPax) - fetchedNode![0].pax = mutablePax + fetchedNode[0].pax = mutablePax do { try context.save() } catch { @@ -601,38 +585,38 @@ func routingPacket (packet: MeshPacket, connectedNodeNum: Int64, context: NSMana let logString = String.localizedStringWithFormat("mesh.log.routing.message %@ %@".localized, String(packet.decoded.requestID), routingErrorString) MeshLogger.log("đŸ•¸ī¸ \(logString)") - let fetchMessageRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MessageEntity") + let fetchMessageRequest = MessageEntity.fetchRequest() fetchMessageRequest.predicate = NSPredicate(format: "messageId == %lld", Int64(packet.decoded.requestID)) do { - let fetchedMessage = try context.fetch(fetchMessageRequest) as? [MessageEntity] - if fetchedMessage?.count ?? 0 > 0 { + let fetchedMessage = try context.fetch(fetchMessageRequest) + if fetchedMessage.count > 0 { - if fetchedMessage![0].toUser != nil { + if fetchedMessage[0].toUser != nil { // Real ACK from DM Recipient if packet.to != packet.from { - fetchedMessage![0].realACK = true + fetchedMessage[0].realACK = true } } - fetchedMessage![0].ackError = Int32(routingMessage.errorReason.rawValue) + fetchedMessage[0].ackError = Int32(routingMessage.errorReason.rawValue) if routingMessage.errorReason == Routing.Error.none { - fetchedMessage![0].receivedACK = true + fetchedMessage[0].receivedACK = true } - fetchedMessage![0].ackSNR = packet.rxSnr - fetchedMessage![0].ackTimestamp = Int32(truncatingIfNeeded: packet.rxTime) + fetchedMessage[0].ackSNR = packet.rxSnr + fetchedMessage[0].ackTimestamp = Int32(truncatingIfNeeded: packet.rxTime) - if fetchedMessage![0].toUser != nil { - fetchedMessage![0].toUser!.objectWillChange.send() + if fetchedMessage[0].toUser != nil { + fetchedMessage[0].toUser!.objectWillChange.send() } else { - let fetchMyInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MyInfoEntity") + let fetchMyInfoRequest = MyInfoEntity.fetchRequest() fetchMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", connectedNodeNum) do { - let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) as? [MyInfoEntity] - if fetchedMyInfo?.count ?? 0 > 0 { + let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) + if fetchedMyInfo.count > 0 { - for ch in fetchedMyInfo![0].channels!.array as? [ChannelEntity] ?? [] where ch.index == packet.channel { + for ch in fetchedMyInfo[0].channels!.array as? [ChannelEntity] ?? [] where ch.index == packet.channel { ch.objectWillChange.send() } } @@ -666,14 +650,11 @@ func telemetryPacket(packet: MeshPacket, connectedNode: Int64, context: NSManage let telemetry = TelemetryEntity(context: context) - let fetchNodeTelemetryRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeTelemetryRequest = NodeInfoEntity.fetchRequest() fetchNodeTelemetryRequest.predicate = NSPredicate(format: "num == %lld", Int64(packet.from)) do { - - guard let fetchedNode = try context.fetch(fetchNodeTelemetryRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeTelemetryRequest) if fetchedNode.count == 1 { if telemetryMessage.variant == Telemetry.OneOf_Variant.deviceMetrics(telemetryMessage.deviceMetrics) { // Device Metrics @@ -788,12 +769,10 @@ func textMessageAppPacket(packet: MeshPacket, wantRangeTestPackets: Bool, connec MeshLogger.log("đŸ’Ŧ \("mesh.log.textmessage.received".localized)") - let messageUsers: NSFetchRequest = NSFetchRequest.init(entityName: "UserEntity") + let messageUsers = UserEntity.fetchRequest() messageUsers.predicate = NSPredicate(format: "num IN %@", [packet.to, packet.from]) do { - guard let fetchedUsers = try context.fetch(messageUsers) as? [UserEntity] else { - return - } + let fetchedUsers = try context.fetch(messageUsers) let newMessage = MessageEntity(context: context) newMessage.messageId = Int64(packet.id) newMessage.messageTimestamp = Int32(bitPattern: packet.rxTime) @@ -864,13 +843,11 @@ func textMessageAppPacket(packet: MeshPacket, wantRangeTestPackets: Bool, connec } } else if newMessage.fromUser != nil && newMessage.toUser == nil { - let fetchMyInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MyInfoEntity") + let fetchMyInfoRequest = MyInfoEntity.fetchRequest() fetchMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", Int64(connectedNode)) do { - guard let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) as? [MyInfoEntity] else { - return - } + let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) if !fetchedMyInfo.isEmpty { appState.unreadChannelMessages = fetchedMyInfo[0].unreadMessages UIApplication.shared.applicationIconBadgeNumber = appState.unreadChannelMessages + appState.unreadDirectMessages @@ -917,15 +894,13 @@ func waypointPacket (packet: MeshPacket, context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.waypoint.received %@".localized, String(packet.from)) MeshLogger.log("📍 \(logString)") - let fetchWaypointRequest: NSFetchRequest = NSFetchRequest.init(entityName: "WaypointEntity") + let fetchWaypointRequest = WaypointEntity.fetchRequest() fetchWaypointRequest.predicate = NSPredicate(format: "id == %lld", Int64(packet.id)) do { if let waypointMessage = try? Waypoint(serializedData: packet.decoded.payload) { - guard let fetchedWaypoint = try context.fetch(fetchWaypointRequest) as? [WaypointEntity] else { - return - } + let fetchedWaypoint = try context.fetch(fetchWaypointRequest) if fetchedWaypoint.isEmpty { let waypoint = WaypointEntity(context: context) diff --git a/Meshtastic/Persistence/QueryCoreData.swift b/Meshtastic/Persistence/QueryCoreData.swift index b68c36d6..f023eb9b 100644 --- a/Meshtastic/Persistence/QueryCoreData.swift +++ b/Meshtastic/Persistence/QueryCoreData.swift @@ -9,13 +9,11 @@ import CoreData public func getNodeInfo(id: Int64, context: NSManagedObjectContext) -> NodeInfoEntity? { - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(id)) do { - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return nil - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) if fetchedNode.count == 1 { return fetchedNode[0] } @@ -28,15 +26,13 @@ public func getNodeInfo(id: Int64, context: NSManagedObjectContext) -> NodeInfoE public func getStoreAndForwardMessageIds(seconds: Int, context: NSManagedObjectContext) -> [UInt32] { let time = seconds * -1 - let fetchMessagesRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MessageEntity") + let fetchMessagesRequest = MessageEntity.fetchRequest() let timeRange = Calendar.current.date(byAdding: .minute, value: time, to: Date()) let milleseconds = Int32(timeRange?.timeIntervalSince1970 ?? 0) fetchMessagesRequest.predicate = NSPredicate(format: "receivedTimestamp >= %d", milleseconds) do { - guard let fetchedMessages = try context.fetch(fetchMessagesRequest) as? [MessageEntity] else { - return [] - } + let fetchedMessages = try context.fetch(fetchMessagesRequest) if fetchedMessages.count == 1 { return fetchedMessages.map { UInt32($0.messageId) } } @@ -48,13 +44,11 @@ public func getStoreAndForwardMessageIds(seconds: Int, context: NSManagedObjectC public func getTraceRoute(id: Int64, context: NSManagedObjectContext) -> TraceRouteEntity? { - let fetchTraceRouteRequest: NSFetchRequest = NSFetchRequest.init(entityName: "TraceRouteEntity") + let fetchTraceRouteRequest = TraceRouteEntity.fetchRequest() fetchTraceRouteRequest.predicate = NSPredicate(format: "id == %lld", Int64(id)) do { - guard let fetchedTraceRoute = try context.fetch(fetchTraceRouteRequest) as? [TraceRouteEntity] else { - return nil - } + let fetchedTraceRoute = try context.fetch(fetchTraceRouteRequest) if fetchedTraceRoute.count == 1 { return fetchedTraceRoute[0] } @@ -66,13 +60,11 @@ public func getTraceRoute(id: Int64, context: NSManagedObjectContext) -> TraceRo public func getUser(id: Int64, context: NSManagedObjectContext) -> UserEntity { - let fetchUserRequest: NSFetchRequest = NSFetchRequest.init(entityName: "UserEntity") + let fetchUserRequest = UserEntity.fetchRequest() fetchUserRequest.predicate = NSPredicate(format: "num == %lld", Int64(id)) do { - guard let fetchedUser = try context.fetch(fetchUserRequest) as? [UserEntity] else { - return UserEntity(context: context) - } + let fetchedUser = try context.fetch(fetchUserRequest) if fetchedUser.count == 1 { return fetchedUser[0] } @@ -84,13 +76,11 @@ public func getUser(id: Int64, context: NSManagedObjectContext) -> UserEntity { public func getWaypoint(id: Int64, context: NSManagedObjectContext) -> WaypointEntity { - let fetchWaypointRequest: NSFetchRequest = NSFetchRequest.init(entityName: "WaypointEntity") + let fetchWaypointRequest = WaypointEntity.fetchRequest() fetchWaypointRequest.predicate = NSPredicate(format: "id == %lld", Int64(id)) do { - guard let fetchedWaypoint = try context.fetch(fetchWaypointRequest) as? [WaypointEntity] else { - return WaypointEntity(context: context) - } + let fetchedWaypoint = try context.fetch(fetchWaypointRequest) if fetchedWaypoint.count == 1 { return fetchedWaypoint[0] } diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index 1ef04ff7..d676a9ed 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -9,13 +9,11 @@ import OSLog public func clearPax(destNum: Int64, context: NSManagedObjectContext) -> Bool { - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(destNum)) do { - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return false - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) let newPax = [PaxCounterLog]() fetchedNode[0].pax? = NSOrderedSet(array: newPax) do { @@ -34,13 +32,11 @@ public func clearPax(destNum: Int64, context: NSManagedObjectContext) -> Bool { public func clearPositions(destNum: Int64, context: NSManagedObjectContext) -> Bool { - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(destNum)) do { - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return false - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) let newPostions = [PositionEntity]() fetchedNode[0].positions? = NSOrderedSet(array: newPostions) do { @@ -59,13 +55,11 @@ public func clearPositions(destNum: Int64, context: NSManagedObjectContext) -> B public func clearTelemetry(destNum: Int64, metricsType: Int32, context: NSManagedObjectContext) -> Bool { - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(destNum)) do { - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return false - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) let emptyTelemetry = [TelemetryEntity]() fetchedNode[0].telemetries? = NSOrderedSet(array: emptyTelemetry) do { @@ -139,12 +133,12 @@ func upsertNodeInfoPacket (packet: MeshPacket, context: NSManagedObjectContext) guard packet.from > 0 else { return } - let fetchNodeInfoAppRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoAppRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoAppRequest.predicate = NSPredicate(format: "num == %lld", Int64(packet.from)) do { - let fetchedNode = try context.fetch(fetchNodeInfoAppRequest) as? [NodeInfoEntity] ?? [] + let fetchedNode = try context.fetch(fetchNodeInfoAppRequest) if fetchedNode.count == 0 { // Not Found Insert let newNode = NodeInfoEntity(context: context) @@ -287,7 +281,7 @@ func upsertPositionPacket (packet: MeshPacket, context: NSManagedObjectContext) let logString = String.localizedStringWithFormat("mesh.log.position.received %@".localized, String(packet.from)) MeshLogger.log("📍 \(logString)") - let fetchNodePositionRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodePositionRequest = NodeInfoEntity.fetchRequest() fetchNodePositionRequest.predicate = NSPredicate(format: "num == %lld", Int64(packet.from)) do { @@ -296,18 +290,14 @@ func upsertPositionPacket (packet: MeshPacket, context: NSManagedObjectContext) /// Don't save empty position packets from null island or apple park if (positionMessage.longitudeI != 0 && positionMessage.latitudeI != 0) && (positionMessage.latitudeI != 373346000 && positionMessage.longitudeI != -1220090000) { - guard let fetchedNode = try context.fetch(fetchNodePositionRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodePositionRequest) if fetchedNode.count == 1 { // Unset the current latest position for this node - let fetchCurrentLatestPositionsRequest: NSFetchRequest = NSFetchRequest.init(entityName: "PositionEntity") + let fetchCurrentLatestPositionsRequest = PositionEntity.fetchRequest() fetchCurrentLatestPositionsRequest.predicate = NSPredicate(format: "nodePosition.num == %lld && latest = true", Int64(packet.from)) - guard let fetchedPositions = try context.fetch(fetchCurrentLatestPositionsRequest) as? [PositionEntity] else { - return - } + let fetchedPositions = try context.fetch(fetchCurrentLatestPositionsRequest) if fetchedPositions.count > 0 { for position in fetchedPositions { position.latest = false @@ -388,13 +378,11 @@ func upsertBluetoothConfigPacket(config: Meshtastic.Config.BluetoothConfig, node let logString = String.localizedStringWithFormat("mesh.log.bluetooth.config %@".localized, String(nodeNum)) MeshLogger.log("đŸ“ļ \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save Device Config if !fetchedNode.isEmpty { if fetchedNode[0].bluetoothConfig == nil { @@ -429,13 +417,11 @@ func upsertDeviceConfigPacket(config: Meshtastic.Config.DeviceConfig, nodeNum: I let logString = String.localizedStringWithFormat("mesh.log.device.config %@".localized, String(nodeNum)) MeshLogger.log("📟 \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save Device Config if !fetchedNode.isEmpty { if fetchedNode[0].deviceConfig == nil { @@ -485,13 +471,11 @@ func upsertDisplayConfigPacket(config: Meshtastic.Config.DisplayConfig, nodeNum: let logString = String.localizedStringWithFormat("mesh.log.display.config %@".localized, String(nodeNum)) MeshLogger.log("đŸ–Ĩī¸ \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save Device Config if !fetchedNode.isEmpty { @@ -551,12 +535,10 @@ func upsertLoRaConfigPacket(config: Meshtastic.Config.LoRaConfig, nodeNum: Int64 let logString = String.localizedStringWithFormat("mesh.log.lora.config %@".localized, String(nodeNum)) MeshLogger.log("đŸ“ģ \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", nodeNum) do { - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save LoRa Config if fetchedNode.count > 0 { if fetchedNode[0].loRaConfig == nil { @@ -618,14 +600,11 @@ func upsertNetworkConfigPacket(config: Meshtastic.Config.NetworkConfig, nodeNum: let logString = String.localizedStringWithFormat("mesh.log.network.config %@".localized, String(nodeNum)) MeshLogger.log("🌐 \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save WiFi Config if !fetchedNode.isEmpty { if fetchedNode[0].networkConfig == nil { @@ -665,14 +644,11 @@ func upsertPositionConfigPacket(config: Meshtastic.Config.PositionConfig, nodeNu let logString = String.localizedStringWithFormat("mesh.log.position.config %@".localized, String(nodeNum)) MeshLogger.log("đŸ—ēī¸ \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save LoRa Config if !fetchedNode.isEmpty { if fetchedNode[0].positionConfig == nil { @@ -727,13 +703,11 @@ func upsertPowerConfigPacket(config: Meshtastic.Config.PowerConfig, nodeNum: Int let logString = String.localizedStringWithFormat("mesh.log.power.config %@".localized, String(nodeNum)) MeshLogger.log("đŸ—ēī¸ \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save Power Config if !fetchedNode.isEmpty { if fetchedNode[0].powerConfig == nil { @@ -777,14 +751,11 @@ func upsertAmbientLightingModuleConfigPacket(config: Meshtastic.ModuleConfig.Amb let logString = String.localizedStringWithFormat("mesh.log.ambientlighting.config %@".localized, String(nodeNum)) MeshLogger.log("🏮 \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save Ambient Lighting Config if !fetchedNode.isEmpty { @@ -833,14 +804,11 @@ func upsertCannedMessagesModuleConfigPacket(config: Meshtastic.ModuleConfig.Cann let logString = String.localizedStringWithFormat("mesh.log.cannedmessage.config %@".localized, String(nodeNum)) MeshLogger.log("đŸĨĢ \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save Canned Message Config if !fetchedNode.isEmpty { @@ -897,14 +865,11 @@ func upsertDetectionSensorModuleConfigPacket(config: Meshtastic.ModuleConfig.Det let logString = String.localizedStringWithFormat("mesh.log.detectionsensor.config %@".localized, String(nodeNum)) MeshLogger.log("đŸ•ĩī¸ \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save Detection Sensor Config if !fetchedNode.isEmpty { @@ -958,14 +923,11 @@ func upsertExternalNotificationModuleConfigPacket(config: Meshtastic.ModuleConfi let logString = String.localizedStringWithFormat("mesh.log.externalnotification.config %@".localized, String(nodeNum)) MeshLogger.log("đŸ“Ŗ \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save External Notificaitone Config if !fetchedNode.isEmpty { @@ -1028,14 +990,11 @@ func upsertPaxCounterModuleConfigPacket(config: Meshtastic.ModuleConfig.Paxcount let logString = String.localizedStringWithFormat("mesh.log.paxcounter.config %@".localized, String(nodeNum)) MeshLogger.log("🧑‍🤝‍🧑 \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save PAX Counter Config if !fetchedNode.isEmpty { @@ -1073,14 +1032,11 @@ func upsertRtttlConfigPacket(ringtone: String, nodeNum: Int64, context: NSManage let logString = String.localizedStringWithFormat("mesh.log.ringtone.config %@".localized, String(nodeNum)) MeshLogger.log("â›°ī¸ \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save RTTTL Config if !fetchedNode.isEmpty { if fetchedNode[0].rtttlConfig == nil { @@ -1112,14 +1068,11 @@ func upsertMqttModuleConfigPacket(config: Meshtastic.ModuleConfig.MQTTConfig, no let logString = String.localizedStringWithFormat("mesh.log.mqtt.config %@".localized, String(nodeNum)) MeshLogger.log("🌉 \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save MQTT Config if !fetchedNode.isEmpty { @@ -1174,14 +1127,11 @@ func upsertRangeTestModuleConfigPacket(config: Meshtastic.ModuleConfig.RangeTest let logString = String.localizedStringWithFormat("mesh.log.rangetest.config %@".localized, String(nodeNum)) MeshLogger.log("â›°ī¸ \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save Device Config if !fetchedNode.isEmpty { if fetchedNode[0].rangeTestConfig == nil { @@ -1217,15 +1167,11 @@ func upsertSerialModuleConfigPacket(config: Meshtastic.ModuleConfig.SerialConfig let logString = String.localizedStringWithFormat("mesh.log.serial.config %@".localized, String(nodeNum)) MeshLogger.log("🤖 \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } - + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save Device Config if !fetchedNode.isEmpty { @@ -1280,14 +1226,11 @@ func upsertStoreForwardModuleConfigPacket(config: Meshtastic.ModuleConfig.StoreF let logString = String.localizedStringWithFormat("mesh.log.storeforward.config %@".localized, String(nodeNum)) MeshLogger.log("đŸ“Ŧ \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save Store & Forward Sensor Config if !fetchedNode.isEmpty { @@ -1330,14 +1273,11 @@ func upsertTelemetryModuleConfigPacket(config: Meshtastic.ModuleConfig.Telemetry let logString = String.localizedStringWithFormat("mesh.log.telemetry.config %@".localized, String(nodeNum)) MeshLogger.log("📈 \(logString)") - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) do { - - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, save Telemetry Config if !fetchedNode.isEmpty { diff --git a/Meshtastic/Views/Bluetooth/Connect.swift b/Meshtastic/Views/Bluetooth/Connect.swift index 63537d86..d9c2891d 100644 --- a/Meshtastic/Views/Bluetooth/Connect.swift +++ b/Meshtastic/Views/Bluetooth/Connect.swift @@ -302,13 +302,11 @@ struct Connect: View { if UserDefaults.preferredPeripheralId.count > 0 && sub { - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(bleManager.connectedPeripheral?.num ?? -1)) do { - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, check it for a region if !fetchedNode.isEmpty { node = fetchedNode[0] diff --git a/Meshtastic/Views/Messages/Messages.swift b/Meshtastic/Views/Messages/Messages.swift index 13ecbfe7..35206d7c 100644 --- a/Meshtastic/Views/Messages/Messages.swift +++ b/Meshtastic/Views/Messages/Messages.swift @@ -91,12 +91,10 @@ struct Messages: View { self.bleManager.context = context } if UserDefaults.preferredPeripheralId.count > 0 { - let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(UserDefaults.preferredPeripheralNum)) do { - guard let fetchedNode = try context.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity] else { - return - } + let fetchedNode = try context.fetch(fetchNodeInfoRequest) // Found a node, check it for a region if !fetchedNode.isEmpty { node = fetchedNode[0]