in Education by
I am struggling to understand the key differences between DispatchSourceTimer, Timer and asyncAfter (in my case for scheduling a task that needs to be ran every X seconds, although understanding the differences in timers can be useful to) (Or is there another (more efficient) scheduling mechanism in Swift besides the listed timers?). A Timer needs an active run loop on the current queue it was started on. A DispatchSourceTimer does not need that. A Timer keeps the CPU from going into the idle state. Does this apply to DispatchSourceTimer/asyncAfter as well? In what situation a Timer is preferred over a DispatchSourceTimer/asyncAfter? And of course the difference between all of them? I want to schedule work every 15 seconds in my application on a private queue. This means I have to use DispatchSourceTimer because I am on a queue that is not the main thread (or add a runloop to the queue and use Timer). However, I do not see any benefit of even using a Timer in the first place. Maybe there is another operation that I can use that schedule work every X seconds on a private queue that is more efficient than a DispatchSourceTimer, but I did not came across a better solution. Is a DispatchSourceTimer more efficient than a Timer? Or should I go on a self-calling method with asyncAfter? This is the code to create the timers. asyncAfter DispatchQueue.global().asyncAfter(deadline: .now() + .seconds(2)) { // Code } Timer Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { (_) in // Code } DispatchSourceTimer let timer = DispatchSource.makeTimerSource() timer.schedule(deadline: .now() + .seconds(1)) timer.setEventHandler { // Code } timer.activate() Whats are the cons and pros of all the timers? When should I use one above the other? What timer way is the most efficient? I came up with the following: Timer Pros: Can be invalidated No reference needed Can be stopped while it is scheduled. Cons: Prevents CPU to go idle Needs to be run on a queue with a run loop (else nothing happens, even no assertion trigger...) DispatchSourceTimer Pros: Can be cancelled No run loop needed Cons: Needs a strong reference else it gets deallocated instantly asyncAfter Pros: - No run loop needed Cons: - Can not be cancelled (I think) Are there even more timers? Why are there so many timers? I expected some real difference across all the different timers, but I couldn't find them. Alot of questions here as you can read. The main question is: what timers are available and what timers should I use in what case and why? JavaScript questions and answers, JavaScript questions pdf, JavaScript question bank, JavaScript questions and answers pdf, mcq on JavaScript pdf, JavaScript questions and solutions, JavaScript mcq Test , Interview JavaScript questions, JavaScript Questions for Interview, JavaScript MCQ (Multiple Choice Questions)

1 Answer

0 votes
by
Timer is a Swift bridge of NSTimer, which goes back to NeXTSTEP, long, long before Grand Central Dispatch (GCD) and things like DispatchSourceTimer, which didn't come along until 10.6 (in the form of dispatch_source_set_timer) and dispatchAfter (in the form of dispatch_after). NSTimer is based on the run loop, which was the primary way that concurrency was done until GCD. It's a cooperative concurrency system, designed primary to run on a single thread on a single core (though it can be expanded to multi-threaded environments). While the run loop is still very important in Cocoa, it is no longer the primary, or even preferred, way to manage concurrency. Since 10.6, GCD has been the increasingly preferred approach (though adding a block-based NSTimer API in the 10.12 timeframe was a welcome modernization). On the scale of 15 seconds, the efficiency differences are pretty irrelevant. That said, I don't understand your comment "A Timer keeps the CPU from going into the idle state." I don't believe that's true. The CPU will definitely still go into the idle state when waiting on an NSTimer to fire. I would not set up a run loop just to run an NSTimer. You would be much better off scheduling it on the main runloop and then using DispatchQueue.async to do the actual work on some other queue. As a broad rule, I use the highest-level tool that meets the need. Those are the ones that Apple is likely to optimize the best over time with me making the fewest changes. For example, NSTimer fire dates are automatically adjusted to improve energy efficiency. With DispatchSourceTimer, you get control over the leeway setting to get the same benefit, but it's up to you to set it (the default is zero, which has the worst energy impact). Of course, the reverse is also true. DispatchSourceTimer is the lowest level and gives you the most control, so if that's what you need, that's the one to use. For your example, I'd personally probably use a Timer and just dispatch to the private queue as part of the block. But a DispatchSourceTimer would be completely appropriate. asyncAfter is really a different thing, since it's always a one-shot. That's great if you want a one-shot, but it changes things if you want to repeat. If you just call asyncAfter in the block to repeat, it's going to be 15 seconds after the last time you finished, rather than being spaced 15 seconds apart. The former will tend to drift a bit late over time. The design question is this: if for some reason your task took 5 seconds to complete, would you want the next fire event to happen 15 seconds from the end of that, or would you want a constant 15 seconds between each fire event? Your choice there will determine which tool is correct. As a slight note there, NSTimer events are always a little later than they are scheduled. GCD events with a leeway setting can be a little early or a little late. As a practical matter, there's no such thing as being "on time" (that's a period of zero length; you're not going to hit it). So the question is always whether you are promised to be late like NSTimer, or you might be early like GCD with leeway.

Related questions

0 votes
    i tried to make the schedule() method wait till a specific hour and minute comes and start to execute ... Questions for Interview, JavaScript MCQ (Multiple Choice Questions)...
asked Feb 26, 2022 in Education by JackTerrance
0 votes
    i tried to make the schedule() method wait till a specific hour and minute comes and start to execute ... Questions for Interview, JavaScript MCQ (Multiple Choice Questions)...
asked Feb 25, 2022 in Education by JackTerrance
0 votes
    I am working on a personal project and in this personal project, I am trying to implement a countdown ... Questions for Interview, JavaScript MCQ (Multiple Choice Questions)...
asked Apr 2, 2022 in Education by JackTerrance
0 votes
    In our game project we did have a timer loop set to fire about 20 times a second (the same as ... , JavaScript Questions for Interview, JavaScript MCQ (Multiple Choice Questions)...
asked Mar 17, 2022 in Education by JackTerrance
0 votes
    What I'm looking for is a simple timer queue possibly with an external timing source and a poll method ... Questions for Interview, JavaScript MCQ (Multiple Choice Questions)...
asked Mar 16, 2022 in Education by JackTerrance
0 votes
    What I'm looking for is a simple timer queue possibly with an external timing source and a poll method ... Questions for Interview, JavaScript MCQ (Multiple Choice Questions)...
asked Mar 15, 2022 in Education by JackTerrance
0 votes
    What I'm looking for is a simple timer queue possibly with an external timing source and a poll method ... Questions for Interview, JavaScript MCQ (Multiple Choice Questions)...
asked Mar 15, 2022 in Education by JackTerrance
0 votes
    Which function is used to clear the timer value? (a) clearTimervalue() (b) clearTimeout() (c) ... JavaScript Questions for Interview, JavaScript MCQ (Multiple Choice Questions)...
asked Oct 22, 2021 in Education by JackTerrance
0 votes
    Which annoatation is used to inject singleton services like timer service into an ejb?...
asked Nov 7, 2020 in Technology by JackTerrance
0 votes
    What is a timer service in EJB?...
asked Nov 7, 2020 in Technology by JackTerrance
0 votes
    What are the difference between Task and Thread in .NET?...
asked Feb 16, 2023 in Technology by JackTerrance
0 votes
    What's the difference between SDK and Runtime in .NET Core?...
asked Feb 16, 2023 in Technology by JackTerrance
0 votes
    What is the difference between .NET Core and Mono?...
asked Feb 16, 2023 in Technology by JackTerrance
0 votes
    The main difference between SNMPv3 and SNMPv2 is _______. A. Enhanced security B. Integration C. Management D. Integration...
asked Feb 14, 2023 in Technology by JackTerrance
...