2017-06-12 4 views
1

ユーザーがアプリケーションを起動したり、データの編集を終了したときにローカル通知を更新する必要がある場合、基本的に非同期で約2〜3秒かかります。私は、アプリケーションがフォアグラウンドを離れる場合でもこのコードが実行されることを確認する必要があります。swift ios 10コードを非同期に、またはバックグラウンドで実行する

func buildLocalNotifications() 
    let dq = DispatchQueue.global(qos: .userInteractive) 
    dq.async { 
     //recreate the notifications 
    } 
} 

そして私はdidFinishLaunchingWithOptionsからこのメソッドを呼び出すことができたり、ユーザーがフォームを保存するとき、アプリがもっとして3-4秒、そしてもちろんそのブロックしていないUIのためのアクティブなままにしながら、すべてが魔法のように動作します:私は今持っています..ユーザーが画面をロックしたりアプリを終了したりすると、このコードが勝って終了し、通知は作成されません。機密コードを安全に実行するには? 何が起こっているのか - この操作を実行中にローダーを表示しますが、ユーザーのやりとりをブロックします

答えて

0

オクラホマでコードをexcuteにしてください私はいくつかの時間を必要とし、アプリがフォアグラウンドから離れたときに中断してはならないタスクのための解決策を見つけました。 だから我々は、アプリがフォアグラウンドで

class BackgroundTaskManager { 
    let backgroundDQ = DispatchQueue.global(qos: .background) 
    var backgroundUpdateTask: UIBackgroundTaskIdentifier! 

    init(withName: String) { 

     self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(withName: withName) {} 
    } 

    /* Using completion handler to know when code is done*/ 
    func runBackgroundTask(withCode: @escaping (_ cH: @escaping() -> Void) -> Void) 
    { 
     backgroundDQ.async { 
      withCode() { 
       self.endBackgroungTask() 
      } 
     } 
    } 

    func endBackgroungTask() { 
     if backgroundUpdateTask != nil && backgroundUpdateTask != UIBackgroundTaskInvalid { 
      UIApplication.shared.endBackgroundTask(backgroundUpdateTask) 
      backgroundUpdateTask = UIBackgroundTaskInvalid 
     } 
    }  
} 

ではなく、あなたが

let taskManager = BackgroundTaskManager(withName: "LocalNotifications") 
taskManager.doBackgroundTask() { (cH) in 
    //Your code goes here 
    //Send back completion handler so system knows when to finish background task 
    cH() 
} 

詳しい情報と同じように使用することができても、あなたがコードを実行するために使用することができますbeginBackgroundTaskendBackgroundTask

小マネージャを必要とします見つけることができますMedium

0

ユーザーがアプリケーションを終了してもコードが実行されるようにするには、あなたの機能はapplicationWillTerminateです。しかし、システムがあなたのアプリケーションを閉じる前に〜5秒しかコードを実行していないので、ここでは非同期実行は勧められません。ユーザーが既にアプリを終了しているため、コードを同期して実行してもUIの更新をブロックすることはありません。

+0

最初にすべてのあなたに感謝し、 'applicationWillTe終わり。また、質問:f.e.私はいくつかのフォームを保存した後に通知を更新し始めましたが、ほとんど完了しましたが、ユーザーはアプリケーションを終了し、 'applicationWillTerminate'からアップデートを開始しました。それは 'applicationWillTerminate'の前に止められますか? –

+0

確かにテストする必要がありますが、applicationWillTerminateを呼び出す前にシステムがプロセスを閉じるかどうか、またはコードがapplicationWillTerminateで実行されている間にプロセスを実行し続けるかどうかはわかりません。しかし、DispatchQueueに追加された作業項目を手動で取り消すことができます。[this](https://stackoverflow.com/a/38372384/4667835)の回答を参照してください。 –

-1

は背景

DispatchQueue.global(qos: .background).async { 
     // your code here 
    } 
+1

ありがとう@Muhammedはちょうど 'を使用しようとしました。 ''の代わりに ''バックグラウンド ''私の解決策が 'applicationWillTerminate'または 'applicationDidEnterBackground'または' applicationWillResignActive'であるように見えます –

+0

問題が@IgorLantushenko動作した後にソリューションを追加しました答えとして:) – Muhammed

関連する問題