hzx*_*zxu 0 asynchronous objective-c nslog appdelegate
当我的应用程序启动时,我需要将一些剩余数据发送到服务器,所以
applicationDidFinishLaunching
Run Code Online (Sandbox Code Playgroud)
我调用一个方法将一些Core Data实体转换为JSON文本并将其发送到服务器.有时应用程序崩溃是因为:
xxxxxx无法及时发布
我的第一个想法是,我在应用程序启动时正在做某事,这会阻塞主线程,然后我意识到这可能不是问题,因为我使用NSURLConnection发送异步数据,不应该阻塞主线程,经过一些测试,我发现当数据很大时,应用程序更容易崩溃,因为连接是异步的,唯一可疑的代码是当我从Core Data实体创建JSON文本时,我使用NSLog打印它,我试图使用硬编码的大json文件,它总是崩溃,如果我注释掉NSLog线,它不会崩溃.
根据情景,我想知道:
NSLogv的输出是序列化的,因为进程中只有一个线程可以一次执行上述写入/记录.在下一个线程开始尝试之前,所有写入/记录消息的尝试都已完成.
它是否意味着即使它在非主线程中,但它记录了一些长字符串,这导致主线程被阻塞?
非常感谢!
使用GCD队列并异步转储日志.
粗略地说,您需要创建一个串行队列:
lqueue = dispatch_queue_create("com.example.logging", NULL)
Run Code Online (Sandbox Code Playgroud)
使用它写日志:
dispatch_async(lqueue, ^{ /* write log here */ })
Run Code Online (Sandbox Code Playgroud)
我没有测试它,但NSLog你可能不需要使用ASL(asl_*函数族).
或者甚至更好,只需使用一些解决方案,如https://github.com/robbiehanson/CocoaLumberjack已经完成所有这些和更多.
| 归档时间: |
|
| 查看次数: |
2590 次 |
| 最近记录: |