提交 a15dc1d6 编写于 作者: P Peter Sobot 提交者: Christian Noon

Added .stream callback to receive streaming data responses.

上级 b92f4e05
...@@ -116,6 +116,24 @@ public class Request { ...@@ -116,6 +116,24 @@ public class Request {
return self return self
} }
/**
Sets a closure to be called periodically during the lifecycle of the request as data is read from the server.
This closure returns the bytes most recently received from the server, not including data from in previous calls.
If this closure is set, data will only be available within this closure, and will not be otherwise saved.
(The .response closure will be called with nil responseData.)
:param: closure The code to be executed periodically during the lifecycle of the request.
:returns: The request.
*/
public func stream(closure: ((NSData) -> Void)? = nil) -> Self {
if let dataDelegate = delegate as? DataTaskDelegate {
dataDelegate.dataStream = closure
}
return self
}
// MARK: - Response // MARK: - Response
/** /**
...@@ -300,15 +318,21 @@ public class Request { ...@@ -300,15 +318,21 @@ public class Request {
class DataTaskDelegate: TaskDelegate, NSURLSessionDataDelegate { class DataTaskDelegate: TaskDelegate, NSURLSessionDataDelegate {
var dataTask: NSURLSessionDataTask? { return task as? NSURLSessionDataTask } var dataTask: NSURLSessionDataTask? { return task as? NSURLSessionDataTask }
private var totalBytesReceived: Int64 = 0
private var mutableData: NSMutableData private var mutableData: NSMutableData
override var data: NSData? { override var data: NSData? {
return mutableData if dataStream != nil {
return nil
} else {
return mutableData
}
} }
private var expectedContentLength: Int64? private var expectedContentLength: Int64?
var dataProgress: ((bytesReceived: Int64, totalBytesReceived: Int64, totalBytesExpectedToReceive: Int64) -> Void)? var dataProgress: ((bytesReceived: Int64, totalBytesReceived: Int64, totalBytesExpectedToReceive: Int64) -> Void)?
var dataStream: ((data: NSData) -> Void)?
override init(task: NSURLSessionTask) { override init(task: NSURLSessionTask) {
self.mutableData = NSMutableData() self.mutableData = NSMutableData()
...@@ -346,9 +370,13 @@ public class Request { ...@@ -346,9 +370,13 @@ public class Request {
if dataTaskDidReceiveData != nil { if dataTaskDidReceiveData != nil {
dataTaskDidReceiveData!(session, dataTask, data) dataTaskDidReceiveData!(session, dataTask, data)
} else { } else {
mutableData.appendData(data) if let ds = dataStream {
ds(data: data)
} else {
mutableData.appendData(data)
}
totalBytesReceived += data.length
let totalBytesReceived = Int64(mutableData.length)
let totalBytesExpectedToReceive = dataTask.response?.expectedContentLength ?? NSURLSessionTransferSizeUnknown let totalBytesExpectedToReceive = dataTask.response?.expectedContentLength ?? NSURLSessionTransferSizeUnknown
progress.totalUnitCount = totalBytesExpectedToReceive progress.totalUnitCount = totalBytesExpectedToReceive
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册