[Swift4] UI更新/バイブ再生はMain Threadで行う

ヒヨコアラーム作成中にエラーが発生して調べた結果を美貌で記載

実現しようとしたこと

・アプリバッググラウンド時にローカルプッシュを10個仕込む
・アプリフォアグラウンド時にローカルプッシュを取得し、10個未満だった時に
 UIAlertControllerでアラートを表示させつつ、バイブレーション/音声を鳴らす

エラー内容

ヒヨコアラーム[1758:521169] [Assert] Cannot be called with asCopy = NO on non-main thread.

ヒヨコアラーム[1758:521169] [Animation] +[UIView setAnimationsEnabled:] being called from a background thread. Performing any operation from a background thread on UIView or a subclass is not supported and may result in unexpected and insidious behavior. trace=(XXXXXX(略))

エラー時のコード内容

@objc func foreground() {
    print("foreground時の処理")    
    getPushList()
}


func getPushList() {
    let center = UNUserNotificationCenter.current()
    center.getPendingNotificationRequests { (requests: [UNNotificationRequest]) in
        print("プッシュ通知の数",requests.count)
        
        /*******
         プッシュ通知の残数によって処理を変える
         *******/
        
        switch requests.count {
        case 0...9 :
            print("プッシュ数0-9個")
            alarmSounds()
            
        case 10 :
            print("プッシュ通知数10")

        default:
            print("それ以外")
        }
    }
}

原因

エラー内容を見る限り、アニメーションを含むUI更新はMain Threadで行わないといけないとのこと。
※音声再生やバイブレーションも作動しなかったのでその類に含まれるらしい

つまり、alarmSounds()にそういった更新内容が含まれているのであれば、Main Threadで行ってあげないといけない

最終的に修正したコード内容

一応これで解決

@objc func foreground() {
    print("foreground時の処理")
    
    getPushList()

    //以下のコードを追加してMain Threadでの処理とした
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: {
        if self.alarmSoundsFlg == true {
            self.alarmSounds()
        }
    })
}

/*********
 未配信のPush通知を取得する
 *********/
func getPushList() {
    let center = UNUserNotificationCenter.current()
    center.getPendingNotificationRequests { (requests: [UNNotificationRequest]) in
        print("プッシュ通知の数",requests.count)
        
        /*******
         プッシュ通知の残数によって処理を変える
         *******/
        
        switch requests.count {
        case 0...9 :
            print("プッシュ数0-9個")
            alarmSoundsFlg = true //ここで再生ではなくフラグの更新に変更
            
        case 10 :
            print("プッシュ通知数10")

        default:
            print("それ以外")
        }
    }
}

お知らせ

ヒヨコ歩数計という歩きながらヒヨコが育っていくアプリを作って、いろんな方に結構使ってもらっています。
RealmSwift, Admobの動画・インステ・バナー広告、UICollectionView、iOS-Charts、UITableViewを使用しているので、是非ご利用ください!