2017-07-18 18 views
1

私のアプリは制作中です.festRequestの最初の要素を特定のエンティティにキャストしようとしたときにCrashlyticsでいくつかのクラッシュが発生しています。私はこの試合をいかに難しくしても再現できなかった。 NotificationSettingsMOへのリクエストの最初の要素をキャストしようとしたときCoreDataを使用してフェッチするとクラッシュする

static func getSettings() -> NotificationSettingsMO { 
    var settings: NotificationSettingsMO! 

    let moc = DataController.shared.managedObjectContext 

    moc.performAndWait { 
    do { 
     let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "NotificationSettings") 
     settings = try moc.fetch(fetchRequest).first as! NotificationSettingsMO 
    } catch { 
    print(error) 
    } 
    } 

    return settings 

クラッシュが起こると私は、ユーザーが作成されたとき、私はそれを作成するため、実体が存在することを確認しています。これは少数のユーザーにしか起こりませんが、アプリをクラッシュさせるので、何が原因であるのか試してみたいと思っています。

編集:私はそれがクラッシュしたように、クラッシュログ

Crashed: com.apple.main-thread 
0 MyApp      0x100073360 specialized static NotificationSettingsMO.(getSettings() -> NotificationSettingsMO).(closure #1) (NotificationSettingsMO.swift:25) 
1 MyApp      0x10007309c partial apply for static NotificationSettingsMO.(getSettings() -> NotificationSettingsMO).(closure #1) (NotificationSettingsMO.swift) 
2 CoreData      0x18311d08c developerSubmittedBlockToNSManagedObjectContextPerform + 196 
3 CoreData      0x18311cf54 -[NSManagedObjectContext performBlockAndWait:] + 220 
4 MyApp      0x100072fa8 specialized static NotificationSettingsMO.getSettings() -> NotificationSettingsMO (NotificationSettingsMO.swift) 
5 MyApp      0x1000d6190 AppDelegate.getDataOnLaunch() ->() (AppDelegate.swift) 
6 MyApp      0x1000da4bc specialized AppDelegate.application(UIApplication, didFinishLaunchingWithOptions : [UIApplicationLaunchOptionsKey : Any]?) -> Bool (AppDelegate.swift:99) 
7 MyApp      0x1000d3eb8 @objc AppDelegate.application(UIApplication, didFinishLaunchingWithOptions : [UIApplicationLaunchOptionsKey : Any]?) -> Bool (AppDelegate.swift) 
8 UIKit       0x1863f29c0 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 400 
9 UIKit       0x186622184 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 2904 
10 UIKit       0x1866265f0 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1684 
11 UIKit       0x186623764 -[UIApplication workspaceDidEndTransaction:] + 168 
12 FrontBoardServices    0x182bbf7ac __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 36 
13 FrontBoardServices    0x182bbf618 -[FBSSerialQueue _performNext] + 168 
14 FrontBoardServices    0x182bbf9c8 -[FBSSerialQueue _performNextFromRunLoopSource] + 56 
15 CoreFoundation     0x1811d509c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24 
16 CoreFoundation     0x1811d4b30 __CFRunLoopDoSources0 + 540 
17 CoreFoundation     0x1811d2830 __CFRunLoopRun + 724 
18 CoreFoundation     0x1810fcc50 CFRunLoopRunSpecific + 384 
19 UIKit       0x1863eb94c -[UIApplication _run] + 460 
20 UIKit       0x1863e6088 UIApplicationMain + 204 
21 MyApp      0x10001ee18 main (Measurement+Network.swift:26) 
22 libdispatch.dylib    0x180c9a8b8 (Missing) 
+0

クラッシュログも投稿できますか?スタックトレースは、正確に何が起こっているかを理解するのに役立ちます。 –

+0

フェッチ要求によって0の結果が返された場合の処理​​を考慮してください。 – Jonah

+0

「Crashlyticsでいくつかのクラッシュが発生しました」 クラッシュレポートを添付できますか? –

答えて

1

は、オブジェクトが存在しません添付しました。個人的に私は即座に強制的に強制的に嫌いです。オプションの全体のポイントは、何かが無くなったときの管理を手助けすることです。あなたのコードにas!を入れていると、プログラムがクラッシュするように要求しています。私はそれを取り除き、それをif letに置き換えることを提案するでしょう。あなたが100%確実にゼロにならない場合は、まだif letを使用し、elseレポートで、発生したサービスをクラッシュさせる必要があります(CrashlyticsrecordErrorを使用してください - クラッシュと一緒に表示されます)。

あなたの声明について:

私は、ユーザーがぶっきらぼうにそれを置くために

に作成されたとき、私はそれを作成するため、実体が存在すると確信している - あなたは間違っています。コンピュータは常に正しく、人間は常に間違っています。ここで

はなぜ考えられる理由です:コアデータに保存エラー私はあなたがコアデータにオブジェクトを保存すると、ほとんどのプログラムのようにエラーをチェックしていなかったと思われるが、

  • がありました - かあなたがした場合、あなたは本当にエラーで何をすべきか分からなかった。あなたがスマートなら、あなたはそれを記録したでしょう。取得する最も一般的なエラーは、ハードディスク上にスペースがないことです。オブジェクトが最初に保存されなかった場合は、オブジェクトをフェッチするときにそのオブジェクトが存在しません。
  • オブジェクトはありましたが削除されました。コード内でこのオブジェクトを削除する場所があれば、このコードが実行される前に削除された可能性があると考えてください。マルチスレッドと競合状態を探します。
  • オブジェクトはまだ保存されていません。アプリにマルチスレッドがある場合は、競合状態が発生する可能性を考慮する必要があります。

このような状況では、0〜3%の範囲でクラッシュが発生します。

+0

私はまだそれがなぜ起こるかわからないにもかかわらず、私はこの答えを正しいとマークします。私がやっていることは、バックグラウンドコンテキストに保存し、そのコンテキストをメインコンテキストにマージすることです。マージはメインコンテキストのperformAndWaitブロックで行われ、フェッチも同様のブロックで行われます。私はCoreDataに保存する際にエラーが発生したと私は信じています。私はそれを複製できません。 –

関連する問題