格式化日期字符串到Foundation.Date

时间:2017-05-23 15:38:07

标签: ios objective-c swift

我们的应用程序中有一个奇怪的错误,到目前为止只有一个用户遇到过(成千上万)我无法弄清楚如何解决这个问题,所以也许你可以帮助我进一步。

关于以下崩溃(运行时):

#0. Crashed: com.apple.main-thread
0  libswiftFoundation.dylib       0x10e51ec _TZFV10Foundation4Date36_unconditionallyBridgeFromObjectiveCfGSqCSo6NSDate_S0_ + 68
1  XXX                            0x14d804 specialized static Loader._save(NSDictionary, Double, moc : NSManagedObjectContext) -> () (Loader.swift:149)
2  XXX                            0x14d804 specialized static Loader._save(NSDictionary, Double, moc : NSManagedObjectContext) -> () (Loader.swift:149)
3  XXX                            0x14286c static Loader.(registerUser(NSManagedObjectContext) -> ()).(closure #1) (Loader.swift)
4  Alamofire                      0x5aea58 specialized DataRequest.(response<A where ...> (queue : DispatchQueue?, responseSerializer : A, completionHandler : (DataResponse<A.SerializedObject>) -> ()) -> Self).(closure #1).(closure #1) (ResponseSerialization.swift)
5  libdispatch.dylib              0x1b911797 _dispatch_call_block_and_release + 10
6  libdispatch.dylib              0x1b911783 _dispatch_client_callout + 22
7  libdispatch.dylib              0x1b915d05 _dispatch_main_queue_callback_4CF + 902
8  CoreFoundation                 0x1c1ffd69 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
9  CoreFoundation                 0x1c1fde19 __CFRunLoopRun + 848
10 CoreFoundation                 0x1c1510ef CFRunLoopRunSpecific + 470
11 CoreFoundation                 0x1c150f11 CFRunLoopRunInMode + 104
12 GraphicsServices               0x1d8fbb41 GSEventRunModal + 80
13 UIKit                          0x214d5e83 UIApplicationMain + 150
14 XXX                            0xb7b1c main (AppDelegate.swift:26)
15 libdyld.dylib                  0x1b93e4eb start + 2

Loader.swift第149行是:

let createDate : Foundation.Date = dateFormatter.date(from: eventCreated)!

看起来它是libswiftFoundation.dylib中的内部问题。 我对这个问题进行了很多研究,我唯一能找到的就是Apple:

  

SDK中的某些Objective-C方法可能会错误地注释或假设某种类型是非空的而不是可空的。 Swift视为结构的类型,例如NSURL(Foundation.URL)或NSDate(Foundation.Date),会导致名称类似bridgeFromObjectiveC的方法中的运行时崩溃;在其他情况下,它可能导致用户代码中的崩溃或未定义的行为。如果您确定了这种方法,请在bugreport.apple.com上提交报告。作为一种解决方法,在Objective-C中添加一个带有正确的可空性注释的trampoline函数。例如,以下函数将允许您使用接受nil URL的错误处理程序调用FileManager&#39; senumerator(at:includesPropertiesForKeys:options:errorHandler :)方法:   https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html(根据已知问题)

示例如下:

static inline NSDirectoryEnumerator<NSURL *> * _Nullable

fileManagerEnumeratorAtURL(NSFileManager *fileManager, NSURL * _Nonnull url, NSArray<NSURLResourceKey> * _Nullable keys, NSDirectoryEnumerationOptions options, BOOL (^ _Nullable errorHandler)(NSURL * _Nullable errorURL, NSError * _Nonnull error)) {
     return [fileManager enumeratorAtURL:url includingPropertiesForKeys:keys options:options errorHandler:^(NSURL * _Nonnull errorURL, NSError * _Nonnull error) {
          return errorHandler(errorURL, error);
       }];
}

我已经提交了针对此问题的错误报告,但仍未得到Apple的回复(7天后)。我认为这可以解决问题,但我不确定如何将给定的trampoline函数(示例)移植到有效/工作的NSDate / DateFormatter版本。有人知道更多这个问题和/或解决了吗?

0 个答案:

没有答案