★★ Star me to follow the project! ★★
Repeat is small lightweight alternative to NSTimer
with a modern Swift Syntax, no strong references, multiple observers reusable instances.
Repeat is based upon GCD - Grand Central Dispatch.
› Learn More: If you want to learn more about it check out my article on Medium.
Main features offered by Repeat are:
- Simple, less verbose APIs methods to create and manage our timer. Just call
every()
oronce
to create a new Timer even in background thread. - Avoid strong reference to the destination target and avoid NSObject inheritance.
- Support multiple observers to receive fire events from timer.
- Ability to pause , start , resume and reset our timer without allocating a new instance.
- Ability to set different repeat modes (
infinite
: infinite sequence of fires, at regular intervals,finite
: a finite sequence of fires, at regular intervals,once
: a single fire events at specified interval since start).
I'm also working on several other projects you may like. Take a look below:
Library | Description |
---|---|
SwiftDate | The best way to manage date/timezones in Swift |
Hydra | Write better async code: async/await & promises |
Flow | A new declarative approach to table managment. Forget datasource & delegates. |
SwiftRichString | Elegant & Painless NSAttributedString in Swift |
SwiftLocation | Efficient location manager |
SwiftMsgPack | Fast/efficient msgPack encoder/decoder |
The following code create a timer which fires a single time after 5 seconds.
Repeater.once(after: .seconds(5)) { timer in
// do something
}
The following code create a recurrent timer: it will fire every 10 minutes for 5 times, then stops.
Repeater.every(.minutes(10), count: 5) { timer in
// do something
}
The following code create a recurrent timer which fires every hour until it is manually stopped .
Repeater.every(.hours(1)) { timer in
// do something
}
You can create a new instance of timer and start as needed by calling the start()
function.
let timer = Repeater(interval: .seconds(5), mode: .infinite) { _ in
// do something
}
timer.start()
Other functions are:
start()
: start a paused or newly created timerpause()
: pause a running timerreset(_ interval: Interval, restart: Bool)
: reset a running timer, change the interval and restart again if set.fire()
: manually fire an event of the timer from an external source
Properties:
.id
: unique identifier of the timer.mode
: define the type of timer (infinite
,finite
,once
).remainingIterations
: for a.finite
mode it contains the remaining number of iterations before it finishes.
By default a new timer has a single observer specified by the init functions. You can, however, create additional observer by using observe()
function. The result of this call is a token identifier you can use to remove the observer in a second time.
Timer instance received in callback is weak.
let token = timer.observe { _ in
// a new observer is called
}
timer.start()
You can remove an observer by using the token:
timer.remove(token)
Each timer can be in one of the following states, you can observe via .state
property:
.paused
: timer is in idle (never started yet) or paused.running
: timer is currently active and running.finished
: timer lifecycle is finished (it's valid for a finite/once state timer)
You can listen for state change by assigning a function callback for .onStateChanged
property.
timer.onStateChanged = { (timer,newState) in
// your own code
}
Repeat is compatible with Swift 4.x. All Apple platforms are supported:
- iOS 8.0+
- macOS 10.9+
- watchOS 2.0+
- tvOS 9.0+
Latest version of Repeat is 0.3.1 published on 2018/03/06.
Changelog - 0.3.1:
- #8: Disabled Gather Coverage Data to enable successfully Carthage builds.
Changelog - 0.3.0:
- #7: Renamed
Repeat
inRepeater
in order to avoid collision withSwift.Repeat
.
Changelog - 0.2.1:
- #6: Fixed crash on
deinit()
a running timer.
Changelog - 0.2.0:
- #1: Fixed CocoaPods installation
- #2: Fixed leaks with GCD while deallocating dispatch queue
- #3: Refactoring timer's state using a
State
enum which define the possible states of the timer (paused
,running
orfinished
).
CocoaPods is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like Repeat in your projects. You can install it with the following command:
$ sudo gem install cocoapods
CocoaPods 1.0.1+ is required to build Repeat.
To integrate Repeat into your Xcode project using CocoaPods, specify it in your Podfile
:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'TargetName' do
use_frameworks!
pod 'Repeat'
end
Then, run the following command:
$ pod install
Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.
You can install Carthage with Homebrew using the following command:
$ brew update
$ brew install carthage
To integrate Repeat into your Xcode project using Carthage, specify it in your Cartfile
:
github "malcommac/Repeat"
Run carthage
to build the framework and drag the built Repeat.framework
into your Xcode project.