我正在使用一个应用程序,使用适用于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任务被恢复并快速取消时会发生类似的错误。
答案 0 :(得分:2)
libBacktraceRecording.dylib
库是Xcode调试支持的一部分。您永远不应该在非调试版本中看到此特定崩溃。
如果您需要执行任何变通办法(例如降低请求率),请务必将其包装在#if DEBUG
中。
另外,请确保您不会反复创建和删除会话。
除此之外,您可以随时关闭计划中的回溯录音。另见:Memory leak with "libBacktraceRecording.dylib" in React Native ios application
答案 1 :(得分:0)
临时修复(永远不会被接受为正确的答案,因为它不是):
使用Timer
对象延迟至少400 milliseconds
的下一次POST呼叫。