Общедоступная бета-версия iOS 13 - Combine.Future "dyld: Symbol not found" - PullRequest
1 голос
/ 04 июля 2019

При запуске моего приложения на iPad, работающем под управлением iOS 13 beta 2 build, я получаю SIGABRT.Эта сборка отлично работает на симуляторе

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

Я подумал, что это может быть проблема со связыванием, но Combine не отображается в списке библиотек, доступных для связывания.

У кого-нибудь есть обходной путь или я потонул до следующей беты?


Вот мой фрагмент кода:

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

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Ваша бета-версия Xcode и бета-версия iPadOS / iOS должны совпадать. В противном случае может случиться так, что Combine не может быть связан с вашим приложением.

0 голосов
/ 05 июля 2019

Когда я тестировал следующее (а также ваш фрагмент кода) в 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()
    }
}
...