我使用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()
}
}
答案 0 :(得分:6)
在MainFormsController中添加此代码:
deinit {
self.backgroundSession.finishTasksAndInvalidate();
}
答案 1 :(得分:3)
您的代码可能会多次调用createNSURLSession(),这会使NSURLSession行为无效,正如文档所述:
"您必须为每个标识符创建一个会话(在何时指定) 你创建配置对象)。多重的行为 共享相同标识符的会话未定义。"
确保在应用的生命周期内只调用一次(单线)createNSURLSession。
答案 2 :(得分:0)
我认为你已经拥有一个带有标识符backgroundSession的URLSession。第一次电话
- (void)invalidateAndCancel
就此而言。然后尝试使用您的代码。