在Swift 3 iOS中发布HTTP POST时出现未知错误

时间:2016-12-02 08:44:27

标签: ios http networking swift3 nsurlconnection

我正在使用一个应用程序,使用适用于Swift 3的JustHTTP框架将一些数据从资产发送到网络服务器。

我最初使用自己的代码发送数据。

当数据发送并且从网络服务器收到回复时,应用程序有时会完全随机崩溃并出现错误。

有时会发生这种情况,有时它不会发生。

我已将问题跟踪到代码的URLSessions部分 并且错误以堆栈跟踪结束。

但是如何修复此错误? 这种情况发生的原因是什么?

错误是:

并且跟踪看起来像这样:

  

com.apple.NSURLConnectionLoader(9):EXEC_BAD_ACCESS(code = 1,   地址= 0.33)

libBacktraceRecording.dylib`__gcd_queue_item_enqueue_hook_block_invoke:

    0x10e43dea8 <+0>:  pushq  %rbp
    0x10e43dea9 <+1>:  movq   %rsp, %rbp
->  0x10e43deac <+4>:  movq   0x20(%rsi), %rax
    0x10e43deb0 <+8>:  movq   0x20(%rdi), %rcx
    0x10e43deb4 <+12>: cmpq   0x8(%rcx), %rax
    0x10e43deb8 <+16>: sete   %al
    0x10e43debb <+19>: popq   %rbp
    0x10e43debc <+20>: retq   

修改 我怀疑一切都从这里开始:

func sendChunk(chunkOwner: extractionResults, chunkData: Data, chunkIndex: Int, onSuccess: @escaping (assetInfo) -> Void){


        let params = [
            "id"            : chunkOwner.assetInfo.id                        ,
            "filename"      : chunkOwner.assetInfo.filename                  ,
            "part_number"   : String(chunkIndex)                             ,
            "size"          : String(describing: chunkOwner.assetInfo.size  ),
            "md5"           : chunkOwner.MD5                                 ,
        ]



        let partName: String = params["filename"]! + "." + params["id"]! + ".part" +  params["part_number"]!

        if let response = Just.post( "http://192.168.0.23/upload.php", data:params, files:["file":.data(partName, chunkData, nil)]).content {



            let fn = JSON(data: response)["Filename"].stringValue
            let ci = JSON(data: response)["Part_Number"].intValue

            let msg1: String = fn + " (" + String(chunkData.count) + "/"
            let msg2: String = String(chunkOwner.assetInfo.size) + " bytes) "
            let msg3: String = "chunk " + String(ci+1) + " of "
            let msg4: String = String(chunkOwner.assetInfo.chunkCount()) + " was successfully uploaded"
            let msg = msg1 + msg2 + msg3 + msg4

            print( msg)

            onSuccess(chunkOwner.assetInfo)
        }
}

注意:

对象extractionResults是此处AssetManager框架的一部分,可供参考:https://github.com/aidv/AssetManager

编辑2 刚才我收到了错误

  

主题11:EXC_BAD_ACCESS(代码= EXC_i386_GPFLT)

与以前相同的痕迹。

编辑3

看起来好像问题出现在POST一个接一个地发生得太快。

如果我暂停至少0.5秒的POST,那么问题似乎就会消失。

我已经读过其他地方,当URL任务被恢复并快速取消时会发生类似的错误。

2 个答案:

答案 0 :(得分:2)

libBacktraceRecording.dylib库是Xcode调试支持的一部分。您永远不应该在非调试版本中看到此特定崩溃。

如果您需要执行任何变通办法(例如降低请求率),请务必将其包装在#if DEBUG中。

另外,请确保您不会反复创建和删除会话。

除此之外,您可以随时关闭计划中的回溯录音。另见:Memory leak with "libBacktraceRecording.dylib" in React Native ios application

答案 1 :(得分:0)

临时修复(永远不会被接受为正确的答案,因为它不是):

使用Timer对象延迟至少400 milliseconds的下一次POST呼叫。