2016-03-22 21 views
6

Ich erhalte XML-Daten vom Server mithilfe von NSURLSession und NSURLSessionDelegate. Hängt von einigen Bedingungen ab, die ich mit Server verbinde. Wenn ich eine Verbindung zum Server herstelle funktioniert alles ohne Fehler, aber wenn ich keine Verbindung (abhängig von der Bedingung) zum Server und zu einem anderen View Controller (mit Storyboard? .instantiateViewControllerWithIdentifier (id)) bekomme, bekomme ich Folgendes IOS-Fehler:Eine Hintergrund-URLSession mit Bezeichner backgroundSession ist bereits vorhanden

'Eine Hintergrund-URLSession mit Bezeichner backgroundSession existiert bereits!'

Hier ist mein Code:

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: den Grund für den Fehler gefunden.

Fehler bei der Erstellung von NSURLSession im Called View Controller.Called VC enthält Code zum Herunterladen von PDF vom Server. Aber ich weiß nicht, wie ich das lösen soll. Unten ist der Code von 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() 
    } 

} 
+0

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

Antwort

0

Ich denke, Sie haben bereits eine URLSession mit Bezeichner backgroundSession. Erster Anruf

- (void)invalidateAndCancel 

darauf. und dann versuche es mit deinem Code.

+0

Vielen Dank für Ihre Antwort. Ich habe das versucht, aber kein Glück. Ich habe meine Frage bearbeitet. – vsvishnu

+0

Angenommen, Sie bewegen sich vom A-View-Controller zum B-View-Controller. Jetzt rufen Sie wahrscheinlich die invalidateAndCancel-Form des aktuellen View-Controllers an, dh B, und die Session wurde im ersten View-Controller erstellt, dh A. da der B-View-Controller nicht Eigentümer dieser Session ist, kann er die invalidateAndCancel-Methode nicht aufrufen . Bitte prüfe. Vielen Dank. – Ujjwal

+0

Ich erstellte Sitzung in VC A und Verbindungsserver von derselben VC. Am Ende des Abrufens von Daten schrieb ich 'self.session.invalidateAndCancel()'. Nach all diesen Dingen, wenn ich VC B (auf Knopfdruck) anrufe, gibt es keine Probleme, aber wenn ich keine Verbindung zum Server herstelle und wenn ich VC B anrufe, habe ich diesen Fehler bekommen. Ich hoffe du kannst es verstehen. – vsvishnu

3

Fügen Sie diesen Code in Ihre MainFormsController:

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

Ihr Code wahrscheinlich ruft createNSURLSession() mehr als einmal dem Erlöschen der NSURLSession Verhalten, wie Dokumentation sagt:

"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

Stellen Sie sicher, dass createNSURLSession nur einmal (Singletone) für den Lebenszyklus Ihrer App aufgerufen wird.

Verwandte Themen