そのため、バックグラウンド フェッチを行っており、その後 UI を更新したいと考えています。バックグラウンド フェッチ自体 (データベース) は機能しますが、UI を更新したいときにクラッシュunexpectedly found nil while unwrapping an Optional value
します。xCode によるとself.newestPublicationsCollectionView.reloadData()
、updateCollections() 関数でクラッシュが発生する場所です。
func updateCollections() {
// get latest data from Database
latestPublications = getNewestPublications()
self.newestPublicationsCollectionView.reloadData()
self.newestPublicationsCollectionView.layoutIfNeeded()
// fix wrong content height
self.newestPublicationsCollectionViewHeight.constant = self.newestPublicationsCollectionView.collectionViewLayout.collectionViewContentSize().height
}
AppDelegate のその他のコード:
func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
let fetchViewController = PublicationOverviewController()
fetchViewController.fetch {
dispatch_async(dispatch_get_main_queue()) {
fetchViewController.updateCollections()
}
completionHandler(.NewData)
}
}
私の PublicationOverviewController の .fetch
func fetch(completion: () -> Void) {
PublicationFetcher.shared.fetchAllPublications()
completion()
}
クラッシュの原因はメイン スレッドで UI が必要だったからだと思いましたが、それは役に立ちませんでした。どんな入力でもいいでしょう。
詳細:
私の PublicationFetcher.shared.fetchAllPublications() では、次のことを行います。
- バックエンドからデータを取得する
dispatch_async(dispatch_get_main_queue()) { () -> Void in NSNotificationCenter.defaultCenter().postNotificationName("RELOAD_NOTIFICATION", object: nil) }
そのリロード通知の下で、私はupdateCollections()
スウィフト 3 :
DispatchQueue.global(attributes: .qosBackground).async {
print("This is run on the background queue")
DispatchQueue.main.async {
print("This is run on the main queue, after the previous code in outer block")
}
}