繁体   English   中英

崩溃:com.apple.main-thread 部分申请关闭 #2

[英]Crashed: com.apple.main-thread partial apply for closure #2

崩溃报告到 firebase 控制台。 谁能帮我。 我正在使用 Socket 向服务器发送数据。

这是崩溃描述:

Crashed: com.apple.main-thread

0  AppName  0x10ef40 partial apply for closure #2 in sendDataRecursively() + 4329697088 (swift:4329697088)
1  AppName                   0x23824 thunk for @escaping @callee_guaranteed () -> () + 4328732708 (<compiler-generated>:4328732708)
2  libdispatch.dylib              0x1e68 _dispatch_call_block_and_release + 32
3  libdispatch.dylib              0x3a2c _dispatch_client_callout + 20
4  libdispatch.dylib              0x11f48 _dispatch_main_queue_drain + 928
5  libdispatch.dylib              0x11b98 _dispatch_main_queue_callback_4CF + 44
6  CoreFoundation                 0x522f0 
CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 16
7  CoreFoundation                 0xc1f4 __CFRunLoopRun + 2532
8  CoreFoundation                 0x1f6b8 CFRunLoopRunSpecific + 600
9  GraphicsServices               0x1374 GSEventRunModal + 164
10 UIKitCore                      0x513e88 -[UIApplication _run] + 1100
11 UIKitCore                      0x2955ec UIApplicationMain + 364
12 AppName                   0x48dac main + 17 (AppDelegate.swift:17)
13 ???                            0x1008edce4 (Missing) 

这是我的功能:

@objc func sendDataRecursively() {
    let reachability = try! Reachability()
    if reachability.connection != .unavailable {
        DispatchQueue.global(qos: .userInitiated).async { //previous .bakground
        
            if self.msgCnt == 127 {
                self.msgCnt = 0
            }
            self.msgCnt += 1
            self.sendRequest()
        }
    } else {
        DispatchQueue.main.async {
            self.previousStatusWhenDisconnect = self.motionDetectionLbl?.text ?? ""
            self.appDelegate.statusLbl?.text = String(format: "%@ %@", (self.appDelegate.statusLbl?.text)!, StartVCStringsEnglish.disConnectedString)
        }
        self.networkTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.checkNetworkRecursively), userInfo: nil, repeats: true)
    }
}

这是我的另一个功能。 我正在向我的 Socket 函数发送数据。 我没有遇到崩溃,但它被报告到了火力基地。 同样在firebase中没有更多关于崩溃的信息。 它只显示函数名称。

private func sendRequest() {
    self.calculateMessageData()
    var requestData: Data?
    var txData = [UInt8()]
    var crc: Int
    if self.msgID == Int8(EnMessageType.basicSafetyMessage.rawValue) {
        requestData = self.getBasicSafetyMessage()
    } else {
        requestData = self.getPersonalSafetyMessage()
    }
    
        crc = computeCRC(data: requestData!, length: requestData!.count)
        // wrap data in 7E, do byte stuffing and add CRC
        txData = []
        txData.append(0x7E)
        for ii in 0..<requestData!.count {
            switch requestData![ii] {
            case 0x7D:
                txData.append(0x7D)
                txData.append(0x5D)
                break
            case 0x7E:
                txData.append(0x7D)
                txData.append(0x5E)
                break
            default:
                txData.append(requestData![ii])
                break
            }
        }
        txData.append((UInt8)(crc >> 8))
        txData.append((UInt8)(crc & 0xFF))
        txData.append(0x7E)
        requestData = (Data)(txData)

        if AppSingletonVariable.sharedInstance.isConnected == true {      AppSingletonVariable.sharedInstance.mySocket.sendDataToServer(reqData: requestData!)
        }

}

谢谢,

您可以从崩溃描述中看到 sendDataRecursively() 函数的第二个闭包存在问题:

DispatchQueue.main.async {
        self.previousStatusWhenDisconnect = self.motionDetectionLbl?.text ?? ""
        self.appDelegate.statusLbl?.text = String(format: "%@ %@", (self.appDelegate.statusLbl?.text)!, StartVCStringsEnglish.disConnectedString)
    }
self.networkTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.checkNetworkRecursively), userInfo: nil, repeats: true)

问题可能是“!” 在这个表达式中:

(self.appDelegate.statusLbl?.text)!

如果 statusLbl 为 nil,则此代码崩溃。 正如评论中提到的,强制打开选项是不安全的,这就是原因。

用这个替换你的闭包:

DispatchQueue.main.async {
    self.previousStatusWhenDisconnect = self.motionDetectionLbl?.text ?? ""
    if let text = self.appDelegate.statusLbl?.text {
         self.appDelegate.statusLbl?.text = String(format: "%@ %@", text, StartVCStringsEnglish.disConnectedString)
    }
}
self.networkTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.checkNetworkRecursively), userInfo: nil, repeats: true)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM