已存在标识为backgroundSession的后台URLSession

时间:2016-03-22 11:40:05

标签: ios swift

我使用NSURLSession和NSURLSessionDelegate从服务器获取xml数据。取决于我与服务器连接的一些条件。如果我与服务器连接,一切正常,没有任何错误,但如果我没有连接(取决于条件)服务器并转移到另一个视图控制器(通过使用故事板?.instantiateViewControllerWithIdentifier(id))我&# 39; m得到以下IOS错误:

'标识为backgroundSession的后台网址已经存在!'

这是我的代码:

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
 }   
}

编辑:找到错误的原因。

由于在Called View Controller中创建了NSURLSession而发生错误.Called VC包含从服务器下载PDF的代码。但我不知道如何解决这个问题。以下是Called 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()
  }

}

3 个答案:

答案 0 :(得分:6)

在MainFormsController中添加此代码:

deinit {
        self.backgroundSession.finishTasksAndInvalidate();
    }

答案 1 :(得分:3)

您的代码可能会多次调用createNSURLSession(),这会使NSURLSession行为无效,正如文档所述:

  

"您必须为每个标识符创建一个会话(在何时指定)   你创建配置对象)。多重的行为   共享相同标识符的会话未定义。"

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

确保在应用的生命周期内只调用一次(单线)createNSURLSession。

答案 2 :(得分:0)

我认为你已经拥有一个带有标识符backgroundSession的URLSession。第一次电话

- (void)invalidateAndCancel

就此而言。然后尝试使用您的代码。