All Projects → malcommac → Repeat

malcommac / Repeat

Licence: mit
🕦 Modern Timer in Swift, Debouncer and Throttler (alternative to NSTimer) made with GCD

Programming Languages

swift
15916 projects

Labels

Projects that are alternatives of or similar to Repeat

Mycodo
An environmental monitoring and regulation system
Stars: ✭ 936 (-32.37%)
Mutual labels:  timer
Swiftytimer
Swifty API for NSTimer
Stars: ✭ 1,143 (-17.41%)
Mutual labels:  timer
Workerman
An asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols. PHP>=5.3.
Stars: ✭ 9,617 (+594.87%)
Mutual labels:  timer
Prince
Implementing PopRouting
Stars: ✭ 11 (-99.21%)
Mutual labels:  timer
Countdowntask
⌛️A countdown library for Android.
Stars: ✭ 64 (-95.38%)
Mutual labels:  timer
Suzaku
Hashed wheel timer in Swift
Stars: ✭ 77 (-94.44%)
Mutual labels:  timer
Flutter timer and stopwatch
A Timer with all the functionality you would expect. Both Inputs and Outputs are of type Duration.
Stars: ✭ 18 (-98.7%)
Mutual labels:  timer
Stopwatch
⏱️ Single-header C++11 RDTSCP clock and timing utilities released into the public domain.
Stars: ✭ 96 (-93.06%)
Mutual labels:  timer
Alfred Time
Start and stop tracking time with Toggl, Harvest, Everhour or Clockify through Alfred 4
Stars: ✭ 65 (-95.3%)
Mutual labels:  timer
Seckill
Chrome浏览器 抢购、秒杀插件,秒杀助手,定时自动点击
Stars: ✭ 1,278 (-7.66%)
Mutual labels:  timer
Obs Studio Python Scripting Cheatsheet Obspython Examples Of Api
⚫️ OBS Studio API with Python
Stars: ✭ 40 (-97.11%)
Mutual labels:  timer
React Countdown
React Component showing a countdown to certain date and time.
Stars: ✭ 58 (-95.81%)
Mutual labels:  timer
Hackaru
Simple, cross-platform time tracking application
Stars: ✭ 82 (-94.08%)
Mutual labels:  timer
Dinnertime
Cooking timer & scheduler with spoken instructions
Stars: ✭ 7 (-99.49%)
Mutual labels:  timer
Dipstick
Configurable metrics toolkit for Rust applications
Stars: ✭ 92 (-93.35%)
Mutual labels:  timer
Appserver
A multithreaded application server for PHP, written in PHP.
Stars: ✭ 930 (-32.8%)
Mutual labels:  timer
Flip Clock
A flip clock, timer and countdown made with Polymer
Stars: ✭ 69 (-95.01%)
Mutual labels:  timer
Moment Timer
Timer plugin for Moment.js that allows creation of setInterval and setTimeout-like timers.
Stars: ✭ 98 (-92.92%)
Mutual labels:  timer
Timer
This is a simple rxjava2/rxjava3/kotlin-flow timer
Stars: ✭ 93 (-93.28%)
Mutual labels:  timer
Timerlab
⏰ A simple and customizable timer
Stars: ✭ 84 (-93.93%)
Mutual labels:  timer

Repeat - modern NSTimer in GCD, debouncer and throttler

Version License Platform CocoaPods Compatible Carthage Compatible Twitter

★★ Star me to follow the project! ★★
Created by Daniele Margutti - danielemargutti.com

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. It also support debouncer and throttler features.

A deep look at Timers

If you want to learn more about it check out my article on Medium: "The secret world of NSTimer".

Features Highlights

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 references 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).

Moreover Repeat also provide supports for:

  • Debouncer: Debouncer will delay a function call, and every time it's getting called it will delay the preceding call until the delay time is over.
  • Throttler: Throttling wraps a block of code with throttling logic, guaranteeing that an action will never be called more than once each specified interval.

Other Libraries You May Like

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

Documentation

Timer

Note: As any other object Repeater class is subject to the standard memory management rules. So once you create your timer instance you need to retain it somewhere in order to avoid premature deallocation just after the start command.

Create single fire timer

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

self.timer = 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.

self.timer = 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 .

self.timer = 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.

self.timer = Repeater(interval: .seconds(5), mode: .infinite) { _ in
  // do something		
}
timer.start()

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

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.

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		
}
timer.start()

You can remove an observer by using the token:

timer.remove(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
  • .executing: registered observers are being executed
  • .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
}

Debouncer

Since 0.5 Repeater introduced Debouncer class. The Debouncer will delay a function call, and every time it's getting called it will delay the preceding call until the delay time is over.

The debounce function is an extremely useful tool that can help throttle requests. It is different to throttle though as throttle will allow only one request per time period, debounce will not fire immediately and wait the specified time period before firing the request. If there is another request made before the end of the time period then we restart the count. This can be extremely useful for calling functions that often get called and are only needed to run once after all the changes have been made.

let debouncer = Debouncer(.seconds(10))
debouncer.callback = {
	// your code here
}

// Call debouncer to start the callback after the delayed time.
// Multiple calls will ignore the older calls and overwrite the firing time.
debouncer.call()

(Make sure to check out the Unit Tests for further code samples.)

Throttler

Since 0.5 Repeater introduced Throttler class.

Throttling wraps a block of code with throttling logic, guaranteeing that an action will never be called more than once each specified interval. Only the last dispatched code-block will be executed when delay has passed.

let throttler = Throttler(time: .milliseconds(500), {
  // your code here
})

// Call throttler. Defined block will never be called more than once each specified interval.
throttler.call()

Requirements

Repeat is compatible with Swift 4.x. All Apple platforms are supported:

  • iOS 8.0+
  • macOS 10.10+
  • watchOS 2.0+
  • tvOS 9.0+

Latest Version

Latest version of Repeat is 0.5.4 published on 2018/04/28. Full changelog is available in CHANGELOG.md file.

Installation

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 '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

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.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].