ios - 在 Swift 3 iOS 中进行 HTTP POST 时出现未知错误

标签 ios http networking swift3 nsurlconnection

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

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

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

有时会发生,有时不会。

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

但是我该如何解决这个错误呢? 发生这种情况的原因是什么?

错误是:

轨迹看起来像这样:

com.apple.NSURLConnectionLoader (9): EXEC_BAD_ACCESS (code=1, address=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 刚才我收到错误

Thread 11: EXC_BAD_ACCESS (code=EXC_i386_GPFLT)

与之前相同的轨迹。

编辑 3

似乎问题出现在 POST 一个接一个地发生得太快时。

如果我在 POST 中至少停顿 0.5 秒,那么问题似乎就消失了。

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

最佳答案

libBacktraceRecording.dylib 库是 Xcode 调试支持的一部分。你不应该在非调试版本中看到这种特殊的崩溃。

如果您需要采取任何变通办法(例如降低请求速率),请务必将它们包装在 #if DEBUG 中。

另外,请确保您没有重复创建和拆除 session 。

除此之外,您始终可以在方案中关闭回溯记录。另请参阅:Memory leak with "libBacktraceRecording.dylib" in React Native ios application

关于ios - 在 Swift 3 iOS 中进行 HTTP POST 时出现未知错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40927987/

相关文章:

ios - 根据另一个数组的索引检索值

iPhone GameKit 异步服务器模式

ios - 实现 Google map 样式向导 JSON

http - 无法通过 Squid 代理测试基于 HTTP PUT 的文件上传

java - 使用 WAN IP 而不是本地主机的 RESTful Web 应用程序

ios - 单元格宽度对于表格 View 宽度来说太大

performance - 衡量网络浏览器的带宽

security - 在 HEADER 或 URL 中传递 API key ?

mysql - 如何限制mysqldump使用的带宽

java - java 的 parking 场,减少空间