iOS 13 Public 测试版 2 - Combine.Future "dyld: Symbol not found"

iOS 13 Public Beta 2 - Combine.Future "dyld: Symbol not found"

在 iPad 运行 iOS 13 beta 2 版本上启动我的应用程序时,我收到了 SIGABRT。此版本在模拟器上运行良好

dyld: Symbol not found: _$s7Combine6FutureCyxq_GAA9PublisherAAMc Expected in: /System/Library/Frameworks/Combine.framework/Combine

我认为这可能是一个 linking 问题,但 Combine 没有出现在 link 可用的库列表中。

有没有人有变通办法或者我在下一个测试版之前沉没了?


这是我的代码片段:

class ViewController: UIViewController {

    var future: AnyPublisher<String, Error>?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        future = ViewController.makeNumberString(50)
        future?.sink { result in
            print("FUTURE DONE: \(result)")
        }
    }

    static func makeNumberString(_ number: Int) -> AnyPublisher<String, Error> {
        return Combine.Future<Int, Error> { complete in
            DispatchQueue.global(qos: .userInitiated).async {
                complete(.success(number))
            }
        }
        .map { number in
            return "\(number)"
        }
        .eraseToAnyPublisher()
    }
}

当我在 Xcode 11.0 beta 3 (11M362v) 运行 iPad Pro w 13.0 (17A5522f) 上测试以下内容(以及您的代码片段)时,它有效很好。

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        print("viewDidLoad")

        _ = bar().sink { value in
            print("sink", value)
        }
    }

    // some old asynchronous method

    func foo(completion: @escaping (Bool) -> Void) {
        DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
            completion(true)
        }
    }

    // `Future` promise for that old async method

    func bar() -> AnyPublisher<Bool, Never> {
        Future { promise in
            self.foo { value in
                promise(.success(value))
            }
        }
        .eraseToAnyPublisher()
    }
}

您的 Xcode Beta 和 iPadOS/iOS Beta 版本应该匹配。否则可能会发生 Combine 无法链接到您的应用程序的情况。