gpt4 book ai didi

swift4 - 如何在非 Objective-C 类型上匹配 Swift 4 KVO?

转载 作者:行者123 更新时间:2023-12-02 06:53:13 24 4
gpt4 key购买 nike

我有一个Result我在异步进程中使用的类型:

internal enum Result<T> {

case success(T)

case failure(Error)

}

我还有一个APIDataResultContext我用来在 Operation 之间传递数据子类:

internal final class APIDataResultContext: NSObject {

// MARK: Properties

private let lock = NSLock()

private var _result: Result<Data>!

internal var result: Result<Data>! {
get {
lock.lock()
let temp = _result
lock.unlock()
return temp
}
set {
lock.lock()
_result = newValue
lock.unlock()
}
}

}

在我的单元测试中,我需要确定何时 result已设置为APIDataResultContext实例。我无法使用 KVO,因为我的 Result<T>类型不能标记为 dynamic因为它无法用 Objective-C 表示。

我不知道还有什么方法可以让我监控 result除了使用闭包属性或 Notification 之外的其他方式进行更改,我宁愿不这样做。不过,如果有必要,我会采用两者之一。

我还可以通过哪些其他方式监控 result 的更改?

最佳答案

我最终向 APIDataResultContext 添加了一个闭包属性:

internal final class APIDataResultContext {

// MARK: Properties

internal var resultChanged: (()->())?

private let lock = NSLock()

private var _result: Result<Data>!

internal var result: Result<Data>! {
get {
lock.lock()
let temp = _result
lock.unlock()
return temp
}
set {
lock.lock()
_result = newValue
lock.unlock()
resultChanged?()
}
}

}

我在测试中使用闭包来确定结果何时发生更改:

internal func testNeoWsFeedOperationWithDatesPassesDataToResultContext() {
let operationExpectation = expectation(description: #function)
let testData = DataUtility().data(from: "Hello, world!")
let mockSession = MockURLSession()
let testContext = APIDataResultContext()
testContext.resultChanged = {
operationExpectation.fulfill()
guard let result = testContext.result else {
XCTFail("Expected result")
return
}
switch result {
case .failure(_):
XCTFail("Expected data")
case .success(let data):
XCTAssertEqual(data, testData, "Expected '\(testData)'")
}
}
NeoWsFeedOperation(context: testContext, sessionType: mockSession, apiKey: testAPIKey, startDate: testDate, endDate: testDate).start()
mockSession.completionHandler?(testData, nil, nil)
wait(for: [operationExpectation], timeout: 2)
}

关于swift4 - 如何在非 Objective-C 类型上匹配 Swift 4 KVO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47785135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com