NSURLSession didCompleteWithError:如何确定它是什么任务?

时间:2015-08-03 15:49:51

标签: ios swift web-services nsurlsession

我有一个符合NSURLSession委托的类用于下载数据,并且在完成后调用多个服务时遇到问题它们调用方法func URLSession(会话:NSURLSession,任务:NSURLSessionTask,didCompleteWithError错误:NSError?) ,结果在这里被解析和处理,以返回到正确的视图控制器。

我如何知道结果是什么会话或任务,以便我可以调用正确的视图控制器?

import Foundation


class Support{

// MARK - Properties
var ID: Int!
var SoftekID: String!
var Subject: String!
var LastUpdate: String!
var LastUpdatedBy: String!
var Priority: Int!
var Impact: Int!
var SupportType: String!
var Importance: Int!


// MARK: General
init() {
    self.ID = 0
    self.SoftekID = ""
    self.Subject = ""
    self.LastUpdate = ""
    self.LastUpdatedBy = ""
    self.Priority = 0
    self.Impact = 0
    self.SupportType = ""
    self.Importance = 0
}

func getSupportTickets(){
let sp = SuppportProvider()
    sp.getSupportTickets()
}
}

class SuppportProvider: NSObject, NSURLSessionDelegate,      NSURLSessionDataDelegate, NSURLSessionTaskDelegate{

// MARK: - Properties
var mData: NSMutableData?
var session: NSURLSession!

override init(){
    super.init()
    prepareConnection()
}

// MARK: - Methods
func prepareConnection(){

    session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: self, delegateQueue:nil)
}

func getSupportTickets(){
    var request = NSMutableURLRequest(URL: NSURL(string: "http://10.0.58.137/ISOWeb.UI/api/CSMobile/GetSupportTickets?PageNumber=0&PagingSize=10&TicketStatus=Priority")!,
        cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy,
        timeoutInterval: 20.0)

    let task =  session.dataTaskWithRequest(request)

    mData = NSMutableData()
    task.resume()
}

func getHelpInformation(){
    var request = NSMutableURLRequest(URL: NSURL(string: "http://10.0.58.137/ISOWeb.UI/api/CSMobile/GetHelpInformation")!,
        cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy,
        timeoutInterval: 20.0)

    let task = session.dataTaskWithRequest(request)

    mData = NSMutableData()
    task.resume()
}

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {

    mData!.length = 0
    completionHandler(NSURLSessionResponseDisposition.Allow)
}

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {

    mData!.appendData(data)
}

func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {

    if error != nil{
        println("An error has occured completing the request")
    }else{

        //Result for method: getSupportTickets
        var value = NSString(bytes: mData!.mutableBytes, length: mData!.length, encoding: NSUTF8StringEncoding)

        var jError: NSError?

        if let JSONResult: Array<NSDictionary> = NSJSONSerialization.JSONObjectWithData(mData!, options: NSJSONReadingOptions.AllowFragments, error: &jError) as? Array<NSDictionary> {

            if JSONResult.count > 0 {

               var arr = Array<Support>()

                for dict in JSONResult{

                    let item = Support()

                    if (dict["ID"] as? Int != nil) {
                        item.ID = dict["ID"] as! Int
                    }else {
                        item.ID = 0
                    }

                    if (dict["SoftekID"] as? String != nil) {
                        item.SoftekID = dict["SoftekID"] as! String
                    }else {
                        item.SoftekID = ""
                    }

                    if (dict["Subject"] as? String != nil) {
                        item.Subject = dict["Subject"] as! String
                    }else {
                        item.Subject = ""
                    }

                    if (dict["LastUpdate"] as? String != nil) {
                          item.LastUpdate = dict["LastUpdate"] as! String
                    }else {
                        item.LastUpdate = ""
                    }

                    if (dict["LastUpdatedBy"] as? String != nil) {
                         item.LastUpdatedBy = dict["LastUpdatedBy"] as! String
                    }else {
                        item.LastUpdatedBy = ""
                    }

                    if (dict["Priority"] as? Int != nil) {
                         item.Priority = dict["Priority"] as! Int
                    }else {
                         item.Priority = 0
                    }

                    if (dict["Impact"] as? Int != nil) {
                        item.Impact = dict["Impact"] as! Int
                    }else {
                        item.Impact = 0
                    }

                    if (dict["SupportType"] as? String != nil) {
                         item.SupportType = dict["SupportType"] as! String
                    }else {
                        item.SupportType = ""
                    }

                    if (dict["Importance"] as? Int != nil) {
                        item.Importance = dict["Importance"] as! Int
                    }else {
                        item.Importance = 0
                    }

                    arr.append(item)
                }
            }
        }

        //Result for method: getHelpInformation
        //How to know to which task holds the result?
    }
}

}

更新

import Foundation

class CSSupport{

// MARK - Properties
var ID: Int!
var SoftekID: String!
var Subject: String!
var LastUpdate: String!
var LastUpdatedBy: String!
var Priority: Int!
var Impact: Int!
var SupportType: String!
var Importance: Int!


// MARK: General
init() {
    self.ID = 0
    self.SoftekID = ""
    self.Subject = ""
    self.LastUpdate = ""
    self.LastUpdatedBy = ""
    self.Priority = 0
    self.Impact = 0
    self.SupportType = ""
    self.Importance = 0
}
}

class Support:NSObject, NSURLSessionDelegate, NSURLSessionDataDelegate, NSURLSessionTaskDelegate{

// MARK: - Properties
var mData: NSMutableData?
var session: NSURLSession!

 override init(){
    super.init()
    var configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    session = NSURLSession(configuration:configuration, delegate: self, delegateQueue:nil)
}

// MARK: - Methods
func getSupportTickets(){
    var request = NSMutableURLRequest(URL: NSURL(string: "http://10.0.58.137/ISOWeb.UI/api/CSMobile/GetSupportTickets?PageNumber=0&PagingSize=10&TicketStatus=Priority")!,
        cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy,
        timeoutInterval: 20.0)

    let task =  session.dataTaskWithRequest(request)

    mData = NSMutableData()
    task.resume()
}

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {

    mData!.length = 0
    completionHandler(NSURLSessionResponseDisposition.Allow)
}

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {

    mData!.appendData(data)
}

func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {

    if error != nil{
        println("An error has occured completing the request")
    }else{

         var value = NSString(bytes: mData!.mutableBytes, length: mData!.length, encoding: NSUTF8StringEncoding)
         var jError: NSError?

        switch task.taskIdentifier {
        case 1:
            if let JSONResult: Array<NSDictionary> = NSJSONSerialization.JSONObjectWithData(mData!, options: NSJSONReadingOptions.AllowFragments, error: &jError) as? Array<NSDictionary> {

                if JSONResult.count > 0 {

                    var arr = Array<CSSupport>()

                    for dict in JSONResult{

                        let item = CSSupport()

                        if (dict["ID"] as? Int != nil) {
                            item.ID = dict["ID"] as! Int
                        }else {
                            item.ID = 0
                        }

                        if (dict["SoftekID"] as? String != nil) {
                            item.SoftekID = dict["SoftekID"] as! String
                        }else {
                            item.SoftekID = ""
                        }

                        if (dict["Subject"] as? String != nil) {
                            item.Subject = dict["Subject"] as! String
                        }else {
                            item.Subject = ""
                        }

                        if (dict["LastUpdate"] as? String != nil) {
                            item.LastUpdate = dict["LastUpdate"] as! String
                        }else {
                            item.LastUpdate = ""
                        }

                        if (dict["LastUpdatedBy"] as? String != nil) {
                            item.LastUpdatedBy = dict["LastUpdatedBy"] as! String
                        }else {
                            item.LastUpdatedBy = ""
                        }

                        if (dict["Priority"] as? Int != nil) {
                            item.Priority = dict["Priority"] as! Int
                        }else {
                            item.Priority = 0
                        }

                        if (dict["Impact"] as? Int != nil) {
                            item.Impact = dict["Impact"] as! Int
                        }else {
                            item.Impact = 0
                        }

                        if (dict["SupportType"] as? String != nil) {
                            item.SupportType = dict["SupportType"] as! String
                        }else {
                            item.SupportType = ""
                        }

                        if (dict["Importance"] as? Int != nil) {
                            item.Importance = dict["Importance"] as! Int
                        }else {
                            item.Importance = 0
                        }

                        arr.append(item)
                    }
                }
            }
            break

        case 2:

            break

        default:
            println("No task was found.")
            break
        }
    }
}

}

3 个答案:

答案 0 :(得分:4)

是的,缺少任何类型的可自定义存储都有点烦人,特别是因为标识符在每个会话的基础上是唯一的。有几种方法可以解决这个问题:

  • 如果您正在使用后台会话或前景和后台的混合,我认为您可以做的最好的事情是两级查找,其中您将可变字典与每个会话相关联首先查找会话,然后在每个会话字典中按标识符查找任务:

    • 对于后台会话,请提供一个标识符,以用作顶级可变字典中的键。
    • 对于其他会话,请使用会话对象本身作为顶级可变字典中的键。
  • 如果您只使用前台任务(不在后台会话中),您应该能够将任务用作词典键并查找与任务相关的其他数据。 / p>

认为这两种技术都应该正常运行。您也可以在任务上使用关联对象来存储其他数据(只要您不使用后台会话)。

你绝对不能做的一件事(我已经提交了一个关于此的错误)是子类NSURLRequest并在那里存储其他数据,因为NSURLSession在你问的时候返回它自己的NSURLRequest副本(而不是你的自定义子类) for currentRequest,当你请求orginalRequest时,返回一个看似随机的子类实例(与实际的原始请求无关)。

令人惊讶的是,每个人都需要花费多少精力来创建外部词典来解决每个任务和每个会话上缺少简单的refCon对象属性的问题。提交该功能绝对值得提出错误。

答案 1 :(得分:3)

为什么不在taskDescription中使用自己的自定义字符串标识符,该标识符是NSURLSessionTask的成员?

答案 2 :(得分:1)