2017-03-28 3 views
0

私は画像をサーバーにアップロードするのにURLSessionDataDelegateを持っています。以下はその一部です。Swift:他のURLSessionが初期化されたときにURLSessionを初期化しない方法は?

URLSessionは、アップロードする画像を選択するとすぐに初期化されます。

Uploadボタンをタップして、no internet connectionがある場合は、画像をRealmに保存し、アプリが起動されたときに次回にアップロードしています。

保存された画像をアップロードするために、私はOfflinePictureUploadClassというほぼ同じコードの別のクラスを作成しました。

スワイプでアプリを終了してもう一度アプリを終了した場合は、の正しいURLSessionDataDelegateメソッドが実行されています。したがって、この場合は問題はありません。

しかし、アプリケーションを完全に閉じずに正常に再起動すると、メインPictureUploadクラスのデリゲートメソッドが実行されていて、アップロードが失敗しています。

これを克服するにはどうすれば画像が選択されたときに初期化されるURLSessionDataDelegateを初期化解除するのですか。

以下のコードは、画像が選択されたときに初期化されるものを示しています。

fileprivate var DefaultSession: Foundation.URLSession! 
fileprivate var BackgroundSession: Foundation.URLSession! 

override init() { 
    super.init() 
    // default session to fetch 
    let config = URLSessionConfiguration.default 
    config.timeoutIntervalForRequest = 20 
    DefaultSession = Foundation.URLSession(configuration: config, delegate: nil, delegateQueue: .main) 
    // background session 
    let backgroundConfiguration = "com.xxx.backgroundconfiguration.upload" 
    let configuration = URLSessionConfiguration.background(withIdentifier: backgroundConfiguration) 
    BackgroundSession = Foundation.URLSession(configuration: configuration, delegate: self, delegateQueue: .main) 
} 

答えて

0

この基本的な考え方は、プログラムがバックグラウンドモードをサポートしているため、接続を正しくサポートする必要があるということです。バックグラウンドで一定の時間が経過すると、プログラムはサスペンドモードに入ります。したがって、アプリがバックグラウンドになるたびに、システムからさらに時間を求めて、すべての接続を終了または閉じるためにアプリがバックグラウンドで実行される時間を確認できます。これらのメソッドを確認してください:あなたのアプリが中断後に目を覚ましたときに

begin​Background​Task(with​Name:​expiration​Handler:​)

background​Time​Remaining

問題があり、それが停止した同じポイントから正確に続きます。したがって、セッションや接続のタイムアウトなど、あらゆる種類のエラーを取得することができます。

+0

ありがとうございました。私は私の質問でより明確にしようとします。イメージが選択されると、PictureUploadクラスが初期化されます。次の画面では、ユーザーがアップロードをタップしてインターネットがチェックされ、接続がない場合、イメージが保存され、後で接続が確立されるとアップロードされます。問題は、アプリがバックグラウンドで移動され、完全に閉じられていない場合です。インターネットがアクティブで、アプリケーションが再起動されると、PictureUploadのデリゲートメソッドが実行されます。 OfflinePictureUploadクラスを実行することから始まり、Delegateを実行する必要があるとき、PictureUploadクラスに移動します。 – Ananth

+0

ありがとうございました。私はそれをすることができた。背景識別子を変更しました。私はちょうど両方のURLTasksが同じ背景識別子を持っていることに気づいた。だから、識別子を変えることはやりました。 – Ananth

関連する問題