完成处理程序不返回任何内容,即使它看起来像在单步执行时一样
completion handler not returning anything even though its looks like it is when stepping through it
这是函数,它使用 Operation(NSOperation):
typealias ResultType = Result<Data>
typealias CompletionType = (ResultType) -> ()
public var onCompletion: CompletionType?
internal func getNetworkConnection(urlRequest: URLRequest, completionHandler: @escaping CompletionType) {
let task = self.urlSession.dataTask(with: urlRequest, completionHandler: { [weak self] (data, response, error) in
guard let strongSelf = self else {
return
}
if let errorResponse = error {
//strongSelf.result = Result.failure(errorResponse)
strongSelf.onCompletion?(Result.failure(errorResponse))
}
if let responseFromServer = response as? HTTPURLResponse,
200...299 ~= responseFromServer.statusCode{
if let dataResponse = data{
//strongSelf.result = Result.success(dataResponse)
strongSelf.onCompletion?(Result.success(dataResponse))//it hits this point
} else {
strongSelf.onCompletion?(Result.failure(NSError()))
}
}
strongSelf.urlSession.invalidateAndCancel()
})
task.resume()
}
我正在为它编写一个单元测试,但它似乎没有任何东西在完成块中,即使它命中了:strongSelf.onCompletion?(Result.success(dataResponse))
到目前为止,单元测试是这样的:
func test_getNetworkConnection(){
let promise = expectation(description: "Completion handler invoked")
sut?.getNetworkConnection(urlRequest: URLRequest(url: requestURL), completionHandler: { (data) in
print(data) //never prints
promise.fulfill()
})
wait(for: [promise], timeout: 100, enforceOrder: true)//exaggerated timeout but it fails
// XCTAssertTrue(returnedResponse!)
}
知道可能是什么问题吗?
你有一些问题。
- 在数据任务的完成块中,您正在调用
strongSelf.onCompletion?...
,但 onCompletion
是 nil
,因此它什么都不做。
- 您的
getNetworkConnection
函数有一个您从未使用过的 completionHandler
参数。
- 您对
getNetworkConnection
的呼叫取决于被呼叫的 completionHandler
。
好像没有意义了onCompletion
属性.
在数据任务中,将对 strongSelf.onCompletion?...
的调用替换为对 completionHandler
参数的调用。
typealias ResultType = Result<Data>
typealias CompletionType = (ResultType) -> ()
internal func getNetworkConnection(urlRequest: URLRequest, completionHandler: @escaping CompletionType) {
let task = self.urlSession.dataTask(with: urlRequest, completionHandler: { [weak self] (data, response, error) in
guard let strongSelf = self else {
return
}
if let errorResponse = error {
completionHandler(Result.failure(errorResponse))
}
if let responseFromServer = response as? HTTPURLResponse,
200...299 ~= responseFromServer.statusCode{
if let dataResponse = data{
completionHandler(Result.success(dataResponse))
} else {
completionHandler(Result.failure(NSError()))
}
} else {
// TODO - need to call completionHandler here too
}
strongSelf.urlSession.invalidateAndCancel()
})
task.resume()
}
这是函数,它使用 Operation(NSOperation):
typealias ResultType = Result<Data>
typealias CompletionType = (ResultType) -> ()
public var onCompletion: CompletionType?
internal func getNetworkConnection(urlRequest: URLRequest, completionHandler: @escaping CompletionType) {
let task = self.urlSession.dataTask(with: urlRequest, completionHandler: { [weak self] (data, response, error) in
guard let strongSelf = self else {
return
}
if let errorResponse = error {
//strongSelf.result = Result.failure(errorResponse)
strongSelf.onCompletion?(Result.failure(errorResponse))
}
if let responseFromServer = response as? HTTPURLResponse,
200...299 ~= responseFromServer.statusCode{
if let dataResponse = data{
//strongSelf.result = Result.success(dataResponse)
strongSelf.onCompletion?(Result.success(dataResponse))//it hits this point
} else {
strongSelf.onCompletion?(Result.failure(NSError()))
}
}
strongSelf.urlSession.invalidateAndCancel()
})
task.resume()
}
我正在为它编写一个单元测试,但它似乎没有任何东西在完成块中,即使它命中了:strongSelf.onCompletion?(Result.success(dataResponse))
到目前为止,单元测试是这样的:
func test_getNetworkConnection(){
let promise = expectation(description: "Completion handler invoked")
sut?.getNetworkConnection(urlRequest: URLRequest(url: requestURL), completionHandler: { (data) in
print(data) //never prints
promise.fulfill()
})
wait(for: [promise], timeout: 100, enforceOrder: true)//exaggerated timeout but it fails
// XCTAssertTrue(returnedResponse!)
}
知道可能是什么问题吗?
你有一些问题。
- 在数据任务的完成块中,您正在调用
strongSelf.onCompletion?...
,但onCompletion
是nil
,因此它什么都不做。 - 您的
getNetworkConnection
函数有一个您从未使用过的completionHandler
参数。 - 您对
getNetworkConnection
的呼叫取决于被呼叫的completionHandler
。
好像没有意义了onCompletion
属性.
在数据任务中,将对 strongSelf.onCompletion?...
的调用替换为对 completionHandler
参数的调用。
typealias ResultType = Result<Data>
typealias CompletionType = (ResultType) -> ()
internal func getNetworkConnection(urlRequest: URLRequest, completionHandler: @escaping CompletionType) {
let task = self.urlSession.dataTask(with: urlRequest, completionHandler: { [weak self] (data, response, error) in
guard let strongSelf = self else {
return
}
if let errorResponse = error {
completionHandler(Result.failure(errorResponse))
}
if let responseFromServer = response as? HTTPURLResponse,
200...299 ~= responseFromServer.statusCode{
if let dataResponse = data{
completionHandler(Result.success(dataResponse))
} else {
completionHandler(Result.failure(NSError()))
}
} else {
// TODO - need to call completionHandler here too
}
strongSelf.urlSession.invalidateAndCancel()
})
task.resume()
}