收藏    我在用   0 人在用
 -  null

Modern alternative to NSTimer in Swift

 GitHub     下载     同步

17    1059    45    over 1 year前

Repeat: modern NSTimer in GCD

Version License Platform
CocoaPods Compatible
Carthage Compatible

<p align="center" >★★ <b>Star me to follow the project! </b> ★★</p>

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() or once 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).

Other Libraries You May Like

I'm also working on several other projects you may like.
Take a look below:

<p align="center" >

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



Create single fire timer

The following code create a timer which fires a single time after 5 seconds.

Repeater.once(after: .seconds(5)) { timer in
  // do something   

Create recurrent finite timer

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       

Create recurrent infinite timer

The following code create a recurrent timer which fires every hour until it is manually stopped .

Repeater.every(.hours(1)) { timer in
  // do something

Manage a timer

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       

Other functions are:

  • start(): start a paused or newly created timer
  • pause(): pause a running timer
  • reset(_ 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


  • .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.

Adding/Removing Observers

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       

You can remove an observer by using the token:


Observing state change

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

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 in Repeater in order to avoid collision with Swift.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 or finished).


<a name="cocoapods" />

Install via CocoaPods

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.

Install via Podfile

To integrate Repeat into your Xcode project using CocoaPods, specify it in your Podfile:

source ''
platform :ios, '8.0'

target 'TargetName' do
pod 'Repeat'

Then, run the following command:

$ pod install

<a name="carthage" />


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.

No Reply at the moment.
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up