Попытка стереть картон через промежуток времени - PullRequest
1 голос
/ 22 января 2020

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

  1. Через 10 секунд скопированный текст очищается и поэтому не может быть вставлен в текущее приложение и другие приложения (например, iMessage, Safari)
  2. Если неидентичный текст копируется, когда истекает 10сек, таймер не стирает его

Попытки

  1. Я пытался сделать это с только DispatchQueue.main.async однако это замораживало исходное приложение.
  2. Однако я попытался сделать это только с DispatchQueue.global(qos: .background).async, но когда я переключился на другое приложение (iMessage), через 10 секунд я все еще мог вставить номер. Мне пришлось go вернуться к исходному приложению и вернуться в iMessage, чтобы оно было стерто с лица
  3. Это моя последняя попытка, такая же, как у # 2, только когда я стираю, когда я go вернуться к исходному приложению и вернуться к iMessage
    private func clearTextAfterDelay(_ copiedCardNumber: String) {
        expirationTimer?.invalidate()
        expirationTimer = Timer.scheduledTimer(withTimeInterval: 10, repeats: false) { timer in
            DispatchQueue.main.async {
                let currentTextOnClipBoard = UIPasteboard.general.string
                if currentTextOnClipBoard == copiedCardNumber {
                    UIPasteboard.general.setValue("", forPasteboardType: UIPasteboard.Name.general.rawValue)
                }
            }
        }

        DispatchQueue.global(qos: .background).async {
            let runLoop = RunLoop.current
            runLoop.add(self.expirationTimer!, forMode: .default)
            runLoop.run()
        }
    }

Ответы [ 2 ]

2 голосов
/ 23 января 2020

Наряду с этой статьей и приведенным выше комментарием я смог разобраться в этом https://medium.com/@abhimuralidharan / задача конечной длины в фоновом режиме- ios -swift-60f2db4fa01b . Ура

class ViewController: MvpViewController {

    private var expirationTimerforBackground: Timer?
    private var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier.invalid

    private func clearTextAfterDelay(_ copiedCardNumber: String) {
        backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
            self?.endBackgroundTask()
        }

        assert(backgroundTask != UIBackgroundTaskIdentifier.invalid)

        self.expirationTimerforBackground?.invalidate()
        self.expirationTimerforBackground = Timer.scheduledTimer(withTimeInterval: 10, repeats: false) { [weak self] _ in
            let currentTextOnClipBoard = UIPasteboard.general.string
            if currentTextOnClipBoard == copiedCardNumber {
                UIPasteboard.general.setValue("", forPasteboardType: UIPasteboard.Name.general.rawValue)
            }
            self?.endBackgroundTask()
        }
    }

    private func endBackgroundTask() {
        UIApplication.shared.endBackgroundTask(backgroundTask)
        backgroundTask = UIBackgroundTaskIdentifier.invalid
    }
}
2 голосов
/ 22 января 2020

Номер 2 не работает, потому что ваше приложение приостанавливается практически сразу после ухода в отставку. Поэтому вам нужно увеличить время активности вашего приложения с помощью фоновых задач.

Взгляните на beginBackgroundTaskWithExpirationHandler документы .

Этот метод запрашивает дополнительное время выполнения фона для вашего приложения. Вызывайте этот метод, когда оставление задачи незавершенной может отрицательно повлиять на работу вашего приложения. Например, вызовите этот метод перед записью данных в файл, чтобы система не приостановила ваше приложение во время выполнения операции.

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