Ang*_*gie 4 web-services ios nsurlsession swift
我有一个符合NSURLSession委托的类,用于下载数据,并且在完成一个以上调用后调用函数func URLSession(session:NSURLSession,task:NSURLSessionTask,didCompleteWithError error: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?
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新
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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
是的,缺少任何类型的可定制存储都令人讨厌,特别是因为标识符仅在每个会话的基础上是唯一的。有几种方法可以解决此问题:
如果您正在使用后台会话或前景和后台会话的混合,我认为您可以做的最好的事情是两级查找,其中将可变字典与每个会话相关联,然后先查找该会话,然后再查找通过每个会话字典中的标识符来完成任务:
如果仅使用前台任务(也就是说,不是在后台会话中),则应该能够仅将任务用作字典键,并查找与任务相关的其他数据。
我认为这两种技术均应正常工作。您也许还可以在任务上使用关联的对象来存储其他数据(只要您不使用后台会话)。
您绝对不能做的一件事(我已经提过一个关于此的错误)是NSURLRequest子类并在那里存储其他数据,因为当您请求currentRequest时,NSURLSession返回其自己的NSURLRequest副本(而不是您的自定义子类),并返回当您请求orginalRequest时,您的子类看似随机的实例(与实际的原始请求无关)。
令人惊讶的是,每个人都要花大量的精力来创建外部词典,以解决每个任务和每个会话上缺少简单的refCon对象属性的问题。绝对值得提出一个错误来请求该功能。
| 归档时间: |
|
| 查看次数: |
3353 次 |
| 最近记录: |