Использование schedule () в проекте iOS - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь использовать расписание (крайний срок: повторение: leeway :) в проекте iOS. В аналогичном проекте MacOS он работает нормально, но в проекте iOS я получаю сообщение об ошибке:

'Расписание (крайний срок: повторение: leeway :)' недоступно

Вот часть кода:

var timeoutTimer : DispatchSourceTimer?

func startUpdateTimer(){
        let delay : DispatchTime = .now() + .seconds(3)

        if timeoutTimer == nil {
            timeoutTimer = DispatchSource.makeTimerSource()
            timeoutTimer!.schedule(deadline: delay, repeating: 0) // Error: 'schedule(deadline:repeating:leeway:)' is unavailable
        ...

Док 1: https://developer.apple.com/documentation/dispatch/dispatchsourcetimer/2920395-schedule

Я хотел бы понять, если я делаю что-то не так, может кто-нибудь сказать мне, должен ли этот код работать на iOS?

PS Использование scheduleRepeating (deadline: interval: leeway :), которое устарело вместо расписания (дедлайн: repeat: leeway :), похоже, работает. К сожалению, на данный момент у меня недостаточно знаний, чтобы понять, как эти два утверждения различаются.

timeoutTimer!.scheduleRepeating(deadline: delay, interval: 0)

Документ 2: https://developer.apple.com/documentation/dispatch/dispatchsourcetimer/2016072-schedulerepeating

1 Ответ

0 голосов
/ 23 мая 2018

scheduleRepeating(deadline:interval:leeway:) был представлен в iOS 7 / macOS 10.9 и устарел в iOS 11 / macOS 10.13.

Изначально Apple предлагала варианты scheduleRepeating и scheduleOneshot, но это не имело смысла, как если бытаймер повторяется или один выстрел может быть вычтен исключительно по аргументам, переданным функции.Теперь они предлагают только schedule(deadline:repeating:leeway:), и если вызывается с ненулевым значением для повторения, таймер повторяется, в противном случае он является однократным.

Однако, обратите внимание, что на самом деле таймеры GCD не являются реальными объектамини объекты Swift, ни объекты Objective-C, на самом деле они являются структурами C, представленными в виде непрозрачных указателей.Если вы создаете такой объект GCD в C или Obj-C, код выглядит следующим образом:

dispatch_source_t ds = dispatch_source_create(
    DISPATCH_SOURCE_TYPE_TIMER, 0, 0, someQueue
);
dispatch_source_set_timer(ds, startTime, interval, leeway);

Создание объектов GCD в виде объектов Swift на самом деле является некой «магией», встроенной в Xcode и Swift SDK.schedule(deadline:repeating:leeway:) доступен только в том случае, если вы используете Xcode 9+ и Swift 4. Если вы используете Xcode 8.x или Swift 3 в Xcode 9+, тогда доступен только устаревший scheduleRepeating(deadline:interval:leeway:).

В отличие от других API, речь не идет о версии iOS / macOS SDK, для которой вы создаете, так как эта магия не предоставляется iOS / macOS SDK, она зависит от версии Swift SDK, для которой вы создаете иэта версия не зависит от целевой операционной системы, поскольку SDK встроен в ваше приложение и, следовательно, поставляется вместе с вашим приложением.

Именно поэтому вы можете использовать schedule(deadline:repeating:leeway:) в Swift 4 в Xcode 9+ и по-прежнему развертыватьвплоть до iOS 7.0 / macOS 10.9, поскольку вызов изменился только для вашего кода Swift, внутренне он использует те же вызовы GCD API, которые ранее использовались устаревшими методами, поэтому скомпилированный код прекрасно работает даже на этих старых ОСверсии.

Чтобы ответить на ваш вопрос о различиях утверждений: у них разные имена и аргументы имеют разные имена, за исключением того, что типы аргументов идентичны, и они также работают одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...