2016-03-22 13 views
6

Tôi đang tìm nạp dữ liệu xml từ máy chủ bằng cách sử dụng NSURLSession và NSURLSessionDelegate. Phụ thuộc vào một số điều kiện tôi đang kết nối với máy chủ. Nếu tôi kết nối với tất cả mọi thứ máy chủ hoạt động tốt mà không có bất kỳ lỗi nào nhưng nếu tôi không kết nối (phụ thuộc vào điều kiện) đến máy chủ và chuyển sang một View Controller khác (bằng cách sử dụng storyboard? .instantiateViewControllerWithIdentifier (id)) Lỗi iOS:Một URLSession nền với định danh backgroundSession đã tồn tại

'URL nềnPhiên bản với nền định danhPhiên bản đã tồn tại!'

Đây là mã của tôi:

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: Tìm thấy lý do cho các lỗi.

Lỗi xảy ra do việc tạo NSURLSession trong Bộ điều khiển được gọi là Bộ điều khiển.Có dấu VC chứa mã để tải xuống PDF từ máy chủ. Nhưng tôi không biết cách giải quyết chuyện này. Dưới đây là mã được gọi là 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

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

Trả lời

0

Tôi nghĩ bạn đã có URLSession với định danh backgroundSession. Cuộc gọi đầu tiên

- (void)invalidateAndCancel 

trên đó. và sau đó thử với mã của bạn.

+0

Cảm ơn bạn đã trả lời. Tôi đã thử điều này nhưng không may mắn. Tôi đã chỉnh sửa câu hỏi của mình. – vsvishnu

+0

Giả sử bạn đang di chuyển từ Bộ điều khiển chế độ xem sang bộ điều khiển chế độ xem B. Bây giờ có lẽ bạn đang gọi biểu mẫu invalidateAndCancel là bộ điều khiển xem hiện tại tức là B và phiên được tạo trong bộ điều khiển xem đầu tiên tức là A. vì bộ điều khiển khung nhìn B sẽ không có quyền sở hữu phiên đó, nó không thể gọi phương thức invalidateAndCancel trên đó . Hãy kiểm tra. Cảm ơn. – Ujjwal

+0

Tôi đã tạo phiên trong VC A và kết nối máy chủ từ cùng một VC. Vào cuối tìm nạp dữ liệu tôi đã viết 'self.session.invalidateAndCancel()'. Sau khi tất cả những điều này khi tôi gọi VC B (trên một nút bấm) không có vấn đề nhưng nếu tôi không kết nối với máy chủ và khi tôi gọi VC B tôi nhận được lỗi đó. Mong bạn có thể hiểu. – vsvishnu

3

Thêm mã này trong MainFormsController của bạn:

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

Mã của bạn có thể gọi createNSURLSession() nhiều hơn một lần mà vô hiệu hóa hành vi NSURLSession, như tài liệu nói:

"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

Đảm bảo createNSURLSession chỉ được gọi một lần (singletone) cho vòng đời của ứng dụng của bạn.

Các vấn đề liên quan