完成处理程序不返回任何内容,即使它看起来像在单步执行时一样

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!)
}

知道可能是什么问题吗?

你有一些问题。

  1. 在数据任务的完成块中,您正在调用 strongSelf.onCompletion?...,但 onCompletionnil,因此它什么都不做。
  2. 您的 getNetworkConnection 函数有一个您从未使用过的 completionHandler 参数。
  3. 您对 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()
}