Ошибка поиска селектора с использованием NSTimer в Swift

Я пытаюсь использовать функцию NSTimer для проверки запроса каждые пять секунд. За исключением того, что я получаю сообщение об ошибке:

MyApp[13952:2483629] *** NSForwarding: warning: object 0x7f98cd15ab80 of class 'MyApp.Requests' does not implement methodSignatureForSelector: -- trouble ahead

Unrecognized selector -[MyApp.Requests checkReq:]

Мой код упрощен ниже:

var timer: NSTimer?

    func parseUberRequest(dict: NSDictionary) {
        if let reqId = dict["request_id"] as? String {
            timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: "checkReq:", userInfo: ["reqId" : reqId], repeats: false)
        }
    }

    func checkReq(timer: NSTimer) {
        let userInfo = timer.userInfo as! Dictionary<String, String>
        if let reqId = userInfo["reqId"] {
            println(reqId)
        }

    }

Пожалуйста, знайте, что я просмотрел другие ответы на ту же ошибку на этом сайте и обнаружил, что все они невероятно устаревшие. Это XCode 6.4 и Swift 1.2. Objective-C здесь НЕ участвует.

Я также пытался использовать Selector("checkReq:") безрезультатно.


person Nathan McKaskle    schedule 29.08.2015    source источник
comment
Являются ли эти операторы внутри объявления класса? Код работает в моем тесте Swift 2.0.   -  person zaph    schedule 29.08.2015
comment
Прокомментируйте свое редактирование... как только вы разместите все остальное, селектор можно указать с помощью синтаксиса Selector(checkReq:) или checkReq:.   -  person mmc    schedule 29.08.2015


Ответы (2)


Ваш класс (это должен быть класс, а не структура или перечисление), к которому принадлежит этот код, должен наследоваться от NSObject.

Строго говоря, какой бы класс вы ни указали в параметре target: для NSTimer.scheduledTimerWithTimeInterval, он должен наследоваться от NSObject. В этом случае бывает self, в другом случае может и не быть.

person mmc    schedule 29.08.2015
comment
У меня есть другой класс, который использует таймер, он не наследуется от NSObject. Почему-то работает нормально. Он наследуется от UIViewController и CLLLocationManagerDelegate. Они наследуются от NSObject? - person Nathan McKaskle; 29.08.2015
comment
UIViewController делает. CLLLocationManagerDelegate — это протокол. - person mmc; 30.08.2015

Шаблон селектора цели Cocoa должен соответствовать протоколу NSObject.

Сделайте свой класс подклассом NSObject

person vadian    schedule 29.08.2015
comment
У меня есть целый класс, где мне не нужно было делать его подклассом NSObject, почему у меня там работает таймер? Мне также не нужно делать это для NSNotificationCenter. - person Nathan McKaskle; 29.08.2015
comment
См. ниже, @vadian и я оба оговорились. Класс, которому принадлежит этот код, должен наследоваться от NSObject только, потому что вы отправляете себя в качестве целевого объекта для таймера. Цель должна наследоваться от NSObject, а не обязательно от класса, создающего NSTimer. - person mmc; 29.08.2015
comment
Этот другой класс также использует себя в качестве цели. Я предполагаю, что UIViewController наследуется от NSObject? - person Nathan McKaskle; 29.08.2015