From bc2f2b313279ee6beb371856e78f1eeeb46f3078 Mon Sep 17 00:00:00 2001 From: Alex Vasilenko Date: Fri, 2 Jan 2015 13:18:17 +0200 Subject: [PATCH] success/failure callbacks for upload read response for upload --- Net/Net.swift | 25 ++++++------------ Net/NetRequestSerialization.swift | 1 - Net/NetUploadTask.swift | 44 ++++++++++++++++++++----------- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/Net/Net.swift b/Net/Net.swift index 36059fb..01d94d1 100644 --- a/Net/Net.swift +++ b/Net/Net.swift @@ -165,12 +165,12 @@ class Net : NSObject, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, NS } // UPLOAD - func upload(# absoluteUrl: String, data: NSData, startImmediately: Bool = true, progressHandler: ProgressHandler, completionHandler: (NSError?) -> ()) -> UploadTask? { + func upload(# absoluteUrl: String, data: NSData, startImmediately: Bool = true, successHandler: SuccessHandler? = nil, failureHandler: FailureHandler? = nil, progressHandler: ProgressHandler? = nil) -> UploadTask? { if uploadSession == nil { return nil } - let uploader = UploadTask(session: uploadSession!, delegate: self, absoluteUrl: absoluteUrl, data: data, progressHandler: progressHandler, completionHandler: completionHandler) + let uploader = UploadTask(session: uploadSession!, delegate: self, absoluteUrl: absoluteUrl, data: data, progressHandler: progressHandler, successHandler: successHandler, failureHandler: failureHandler) if startImmediately { uploader.resume() @@ -179,12 +179,12 @@ class Net : NSObject, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, NS return uploader } - func upload(# absoluteUrl: String, params: NSDictionary, startImmediately: Bool = true, progressHandler: ProgressHandler, completionHandler: (NSError?) -> ()) -> UploadTask? { + func upload(# absoluteUrl: String, params: NSDictionary, startImmediately: Bool = true, successHandler: SuccessHandler? = nil, failureHandler: FailureHandler? = nil, progressHandler: ProgressHandler? = nil) -> UploadTask? { if uploadSession == nil { return nil } - let uploader = UploadTask(session: uploadSession!, delegate: self, absoluteUrl: absoluteUrl, params: params, progressHandler: progressHandler, completionHandler: completionHandler) + let uploader = UploadTask(session: uploadSession!, delegate: self, absoluteUrl: absoluteUrl, params: params, progressHandler: progressHandler, successHandler: successHandler, failureHandler: failureHandler) if startImmediately { uploader.resume() @@ -193,12 +193,12 @@ class Net : NSObject, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, NS return uploader } - func upload(# absoluteUrl: String, fromFile: NSURL, startImmediately: Bool = true, progressHandler: ProgressHandler, completionHandler: (NSError?) -> ()) -> UploadTask? { + func upload(# absoluteUrl: String, fromFile: NSURL, startImmediately: Bool = true, successHandler: SuccessHandler? = nil, failureHandler: FailureHandler? = nil, progressHandler: ProgressHandler? = nil) -> UploadTask? { if backgroundSession == nil { return nil } - let uploader = UploadTask(session: backgroundSession!, delegate: self, absoluteUrl: absoluteUrl, fromFile: fromFile, progressHandler: progressHandler, completionHandler: completionHandler) + let uploader = UploadTask(session: backgroundSession!, delegate: self, absoluteUrl: absoluteUrl, fromFile: fromFile, progressHandler: progressHandler, successHandler: successHandler, failureHandler: failureHandler) if startImmediately { uploader.resume() @@ -223,19 +223,11 @@ class Net : NSObject, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, NS downloaders.removeValueForKey(downloadTask) } else if task is NSURLSessionUploadTask { - let uploadTask = task as NSURLSessionUploadTask - let uploader = uploaders[uploadTask] - uploader?.didComplete(error) - uploaders.removeValueForKey(uploadTask) + //handled in completionHandler of UploadTask } } else { - if task is NSURLSessionUploadTask { - let uploadTask = task as NSURLSessionUploadTask - let uploader = uploaders[uploadTask] - uploader?.didComplete(nil) - uploaders.removeValueForKey(uploadTask) - } + //handled in completionHandler of UploadTask } } @@ -303,7 +295,6 @@ class Net : NSObject, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, NS */ private func httpRequest(method: HttpMethod, url: String, params: NSDictionary?, successHandler: SuccessHandler, failureHandler: FailureHandler, isAbsoluteUrl: Bool = false) -> NSURLSessionTask { let urlString = isAbsoluteUrl ? url : "\(baseUrl.absoluteString!)\(url)" - NSLog(urlString) let request = requestSerializer.requestWithMethod(method, urlString: urlString, params: params, error: nil) let task = createSessionTaskWithRequest(request, successHandler: successHandler, failureHandler: failureHandler) diff --git a/Net/NetRequestSerialization.swift b/Net/NetRequestSerialization.swift index b89d0db..efc6e03 100644 --- a/Net/NetRequestSerialization.swift +++ b/Net/NetRequestSerialization.swift @@ -38,7 +38,6 @@ class RequestSerialization // send with query params let query = NetHelper.queryStringFromParams(params!) let newUrlString = urlString.stringByAppendingString("?\(query)") - println(newUrlString) request.URL = NSURL(string: newUrlString) } else { diff --git a/Net/NetUploadTask.swift b/Net/NetUploadTask.swift index 65c5326..82d5981 100644 --- a/Net/NetUploadTask.swift +++ b/Net/NetUploadTask.swift @@ -21,6 +21,8 @@ class UploadTask typealias ProgressHandler = (Float) -> () typealias CompletionHandler = (NSError?) -> () + typealias SuccessHandler = (ResponseData) -> () + typealias FailureHandler = (NSError!) -> () private var session: NSURLSession private var delegate: UploadTaskDelegate @@ -28,11 +30,13 @@ class UploadTask private var request: NSMutableURLRequest private var progressHandler: ProgressHandler? - private var completionHandler: CompletionHandler + private var successHandler: SuccessHandler? + private var failureHandler: FailureHandler? + private var state: State = .Init - init(_ session: NSURLSession,_ delegate: UploadTaskDelegate,_ absoluteUrl: String,_ progressHandler: ProgressHandler?,_ completionHandler: CompletionHandler) { + init(_ session: NSURLSession,_ delegate: UploadTaskDelegate,_ absoluteUrl: String,_ progressHandler: ProgressHandler?, _ successHandler: SuccessHandler? = nil, _ failureHandler: FailureHandler? = nil) { self.session = session self.delegate = delegate let url = NSURL(string: absoluteUrl) @@ -40,23 +44,23 @@ class UploadTask request.HTTPMethod = HttpMethod.POST.rawValue self.progressHandler = progressHandler - self.completionHandler = completionHandler + self.successHandler = successHandler + self.failureHandler = failureHandler } - convenience init(session: NSURLSession, delegate: UploadTaskDelegate, absoluteUrl: String, data: NSData, progressHandler: ProgressHandler?, completionHandler: CompletionHandler) { - - self.init(session, delegate, absoluteUrl, progressHandler, completionHandler) + convenience init(session: NSURLSession, delegate: UploadTaskDelegate, absoluteUrl: String, data: NSData, progressHandler: ProgressHandler? = nil, successHandler: SuccessHandler? = nil, failureHandler: FailureHandler? = nil) { + self.init(session, delegate, absoluteUrl, progressHandler, successHandler, failureHandler) // TODO: config for request request.setValue("application/octet-stream", forHTTPHeaderField: "Content-Type") - task = session.uploadTaskWithRequest(request, fromData: data) + task = session.uploadTaskWithRequest(request, fromData: data){ self.didComplete($0, $1, $2) } delegate.didCreateUploadTask(task, uploadTask: self) } - convenience init(session: NSURLSession, delegate: UploadTaskDelegate, absoluteUrl: String, params: NSDictionary, progressHandler: ProgressHandler?, completionHandler: CompletionHandler) { + convenience init(session: NSURLSession, delegate: UploadTaskDelegate, absoluteUrl: String, params: NSDictionary, progressHandler: ProgressHandler? = nil, successHandler: SuccessHandler? = nil, failureHandler: FailureHandler? = nil) { - self.init(session, delegate, absoluteUrl, progressHandler, completionHandler) + self.init(session, delegate, absoluteUrl, progressHandler, successHandler, failureHandler) let boundary = "NET-UPLOAD-boundary-\(arc4random())-\(arc4random())" let paramsData = NetHelper.dataFromParamsWithBoundary(params, boundary: boundary) @@ -64,16 +68,16 @@ class UploadTask request.setValue(contentType, forHTTPHeaderField: "Content-Type") request.setValue("\(paramsData.length)", forHTTPHeaderField: "Content-Length") - task = session.uploadTaskWithRequest(request, fromData: paramsData) + task = session.uploadTaskWithRequest(request, fromData: paramsData){ self.didComplete($0, $1, $2) } delegate.didCreateUploadTask(task, uploadTask: self) } - convenience init(session: NSURLSession, delegate: UploadTaskDelegate, absoluteUrl: String, fromFile: NSURL, progressHandler: ProgressHandler?, completionHandler: CompletionHandler) { + convenience init(session: NSURLSession, delegate: UploadTaskDelegate, absoluteUrl: String, fromFile: NSURL, progressHandler: ProgressHandler?, successHandler: SuccessHandler? = nil, failureHandler: FailureHandler? = nil) { - self.init(session, delegate, absoluteUrl, progressHandler, completionHandler) - - task = session.uploadTaskWithRequest(request, fromFile: fromFile) + self.init(session, delegate, absoluteUrl, progressHandler, successHandler, failureHandler) + + task = session.uploadTaskWithRequest(request, fromFile: fromFile){ self.didComplete($0, $1, $2) } delegate.didCreateUploadTask(task, uploadTask: self) } @@ -108,8 +112,16 @@ class UploadTask self.progressHandler?(progress) } - func didComplete(error: NSError?) { + func didComplete(_ data: NSData, _ response: NSURLResponse, _ error: NSError?) { state = error != nil ? .Failed : .Completed - completionHandler(error) + if (error != nil) { + self.failureHandler?(error) + } + else { + let responseData = ResponseData(response: response, data: data) + self.successHandler?(responseData) + } + + delegate.didRemoveUploadTask(task) } } \ No newline at end of file