New to Objective C and trying to store past gps data using a timer. My code is as follows (‘data’ is declared earlier in the class as an instance of a struct with the multiple arrays you see):
var synchronizer = Timer.scheduledTimer(timeInterval: 1.0, target: timerClass.self, selector: #selector(cycle), userInfo: nil, repeats: true)
@objc func cycle()
{
data.timeArray.insert(Date.init(), at: 0)
if (data.timeArray.count > 30) {
data.timeArray = data.timeArray.dropLast(data.timeArray.count - 30)
}
loc.requestLocation()
let dateFormatter = DateFormatter()
var ts = "Time: ["
for time in data.timeArray {
ts.append(" " + dateFormatter.string(from: time) + ",")
}
ts.append("]")
timeString.text = ts
var ss = "Speed: ["
for loc in data.speedArray {
ss.append(" " + String(format:"%.0f",loc.speed*2.237) + ",")
}
ss.append("]")
timeString.text = ss
}
As soon as the timer actually runs I get this error:
[projectName.timerClass cycle]: unrecognized selector sent to class 0x1032fba38
I have to assume that the issue is with my declaration of ‘synchronizer’, but I can’t find any differing instructions for Objective C.
2
Answers
You appear to be trying to send timer event to a class, rather than to an instance. The target needs to be an instance of
timerClass
(which I hope is spelled "TimerClass" with a leading capital as classes should be).I assume the code takes place in the scope of a class named
timerClass
, so surrounding looks something like this:Since you try to access
self
from the context of default property value, the compiler apparently suggested to switch totimerClass.self
, however that is not what you want to access here, because it refers to the class, not its instance.As long as you need to refer to
self
, you should initialise your property lazily:Or inside of a constructor: