swift - 字符串到日期的转换有时会引发 NSOperationQueue 错误
问题描述
我们的最新版本导致 1% 的用户群出现崩溃错误。我完全坚持这一点,因为它无法在我们的暂存环境中复制。
Firebase Crashlytics 抛出此错误:
Crashed: NSOperationQueue 0x282d76da0 (QOS: UNSPECIFIED)
0 MyApp 0x102d38c40 String.toExpiryDate() + 339 (Extensions.swift:339)
1 MyApp 0x102d3f628 closure #1 in ApiService.unlockVariablePass(credit:complete:) + 235 (ApiService.swift:235)
2 MyApp 0x102d34324 partial apply for closure #1 in HttpClient.post(url:token:username:password:body:callback:) + 53 (HttpClientService.swift:53)
3 MyApp 0x102d693e0 partial apply for closure #1 in NSURLSession.dataTask(with:completionHandler:) + 20 (URLSessionProtocol.swift:20)
4 MyApp 0x102d69210 thunk for @escaping @callee_guaranteed (@guaranteed Data?, @guaranteed NSURLResponse?, @guaranteed Error?) -> () (<compiler-generated>)
5 CFNetwork 0x1936f1688 __75-[__NSURLSessionLocal taskForClass:request:uploadFile:bodyData:completion:]_block_invoke + 32
6 CFNetwork 0x193705220 __49-[__NSCFLocalSessionTask _task_onqueue_didFinish]_block_invoke + 176
7 Foundation 0x193b81ef8 __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 16
8 Foundation 0x193a8e3e0 -[NSBlockOperation main] + 72
9 Foundation 0x193a8d8c8 -[__NSOperationInternal _start:] + 740
10 Foundation 0x193b83c7c __NSOQSchedule_f + 272
我检查了服务器,日志证明 expiry_date 始终以正确的格式提供。它从未为空。
{"expiry_date": "2019-07-05 20:00:36"}
客户端代码:
try? self.httpClient.post(url: url, token: ServerUrlFabric.shared.getTokenForAPI(), username: kc_username, password: kc_password, body: creditDict) { (data, response, error) in
if let error = error {
log(error.localizedDescription)
complete(false, nil, ServiceError.invalidSession)
} else if let httpResponse = response as? HTTPURLResponse {
switch (httpResponse.statusCode) {
case 201:
let json = try! JSONSerialization.jsonObject(with: data!, options: []) as! Dictionary<String, Any>
let expiryDate = (json["expiry_date"] as! String).toExpiryDate()
complete(true, expiryDate, nil)
扩大:
extension String {
func toExpiryDate() -> Date {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.timeZone = TimeZone(abbreviation: "UTC")
return formatter.date(from: self)!
}
}
请问我错过了什么?
解决方案
推荐阅读
- css - 关于 div 继承的说明
- json - 在邮递员表单数据中发布嵌套的 json
- web-scraping - 网页抓取:如何从多个表格主体中抓取一个特定的表格主体?
- keras - 将 NN 回归问题的输出限制在一定范围内的方法(即,我希望我的 NN 始终仅在 -20 到 +30 之间预测输出值)
- asp.net - 有没有办法在 ASP.Net Core ReactJS 模板中构建 Web API?
- c++ - 我可以在 ANTLR4 中使用类似于 c++ 的虚拟令牌(具有相同返回值的令牌)吗?
- javascript - 如何正确执行两个球体之间的碰撞检测?
- java - 如何使用带有导航抽屉的底部导航
- python-2.7 - 在使用 Google Colab 中的所有可用 RAM 后,您的会话崩溃了
- flutter - Flutter 从 json 数组制作 GridView