我正在开发一个应用程序,它使用 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/