2016-03-22 4 views
6

NSURLSessionとNSURLSessionDelegateを使用してサーバーからxmlデータを取得しています。いくつかの条件によっては、私はサーバーに接続しています。私はサーバーに接続している場合、すべてのエラーなしで正常に動作しますが、サーバーに接続していない(別のView Controller(ストーリーボード?.instantiateViewControllerWithIdentifier(id)を使用して)私は次のIOSエラー:識別子backgroundSessionの背景URLセッションが既に存在します

'識別子backgroundSessionを持つ背景URLセッションが既に存在します!'

class MainClass: UITableViewController, NSURLSessionDelegate {  

    var task_service = NSURLSessionDataTask?() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     if(condition) { 
     getXMLFromServer() 
     } 

    } 

    func getXMLFromServer(){ 

    task_service = getURLSession().dataTaskWithRequest() { 

     (data, response, error) -> Void in 

     dispatch_async(dispatch_get_main_queue(), { 

     // Fetching data from server 

     // In the end 
     self.session.invalidateAndCancel() 
     } 
    } 

    } 

func getURLSession() -> NSURLSession { 

    let configuration =  NSURLSessionConfiguration.defaultSessionConfiguration() 

    configuration.timeoutIntervalForRequest = 30.0 

    session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: NSOperationQueue.mainQueue()) 

    return session 
    } 

func URLSession(session: NSURLSession, task: NSURLSessionTask, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { 

    completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)) // Bypassing SSL error 
} 
} 

EDIT:エラーの原因を発見

は、ここに私のコードです。

Called View ControllerでNSURLSessionを作成したためにエラーが発生しました.Called VCには、サーバーからPDFをダウンロードするコードが含まれています。しかし、私はこれを解決する方法を知らない。以下は呼び出されたVCのコードです

class MainFormsController: UIViewController, UIPickerViewDelegate, UITextFieldDelegate, NSURLSessionDownloadDelegate, UIDocumentInteractionControllerDelegate, MFMailComposeViewControllerDelegate{ 

var download_task = NSURLSessionDownloadTask?() 
var backgroundSession = NSURLSession() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    createNSURLSession() 
}    

/** Error occurred while creating this NSURLSession **/ 

    func createNSURLSession() { 

     let backgroundSessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("backgroundSession") 

     backgroundSession = NSURLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: NSOperationQueue.mainQueue()) 
    } 

    func downloadPDF() { 

    //Download PDF 
    download_task = backgroundSession.downloadTaskWithURL(url) 
    download_task?.resume() 
    } 

} 
+0

https://stackoverflow.com/questions/37139641/issues-with-a-background-urlsession-with-identifier –

答えて

0

あなたは既に識別子のbackgroundSessionでURLSessionを持っていると思います。ファーストコール

- (void)invalidateAndCancel 

です。あなたのコードを試してみてください。

+0

ご回答ありがとうございます。私はこれを試したが運がない。私は私の質問を編集しました。 – vsvishnu

+0

AビューコントローラからBビューコントローラに移動しているとします。おそらくあなたはinvalidateAndCancelフォームを現在のView ControllerすなわちBと呼んでいるでしょう。そして、Bビューコントローラはそのセッションの所有権を持たないので、セッションは最初のビューコントローラAで作成されました。invalidateAndCancelメソッドを呼び出せません。チェックしてください。ありがとう。 – Ujjwal

+0

私はVC Aでセッションを作成し、同じVCからサーバーを接続しました。データを取得する最後に、私は 'self.session.invalidateAndCancel()'を書きました。私がVC B(ボタンをクリックして)を呼び出すときこれらのすべての事の後に問題はありませんが、私はサーバーに接続していない場合、私はVC Bを呼び出すときに私はそのエラーを持っています。あなたが理解することを願って。 – vsvishnu

3

あなたMainFormsControllerにこのコードを追加します。

deinit { 
     self.backgroundSession.finishTasksAndInvalidate(); 
    } 
0

あなたのコードは、おそらくcreateNSURLSessionを(呼び出す)NSURLSessionの動作を無効にされ、複数回、ドキュメントが言うように:

"You must create exactly one session per identifier (specified when you create the configuration object). The behavior of multiple sessions sharing the same identifier is undefined."

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html

あなたのアプリのライフサイクルの間、createNSURLSessionが一度だけ呼び出されるようにしてください(シングルトン)。

関連する問題