Skip to content
/ Each Public
forked from dalu93/Each

Elegant ⏱ interface for Swift apps

License

Notifications You must be signed in to change notification settings

Lerist/Each

 
 

Repository files navigation

Each

Elegant ⏱ interface for Swift apps

BuddyBuild

Each is a NSTimer bridge library written in Swift.

Features

  • Completely configurable timers
  • Support for time intervals in ms, seconds, minutes and hours
  • Fully extendable
  • More readable and simple to use in comparison with NSTimer object

Requirements

  • iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+
  • Xcode 8.0+
  • Swift 3.0+

Installation

CocoaPods

CocoaPods is a dependency manager for Cocoa projects. You can install it with the following command:

$ gem install cocoapods

CocoaPods 1.1.0+ is required to build Each 1.0.0+.

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

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!

target '<Your Target Name>' do
pod 'Each', '~> 1.1'
end

Then, run the following command:

$ pod install

Usage

Creating a new timer instance

let timer = Each(1).seconds     // Can be .milliseconds, .seconds, .minute, .hours  

Performing operations

timer.perform {
    // Do your operations
    // This closure has to return a Boolean value
    // Return .continue if you want to leave the timer active, otherwise
    // return .stop to invalidate it
}

Stopping the timer manually

timer.stop()    // This stops immediately the timer

Restarting the timer

You can restart the timer only after you stopped it. This method restarts the timer with the same perform closure.

timer.restart()

Leaks

Unfortunately the interface doesn't help you with handling the memory leaks the timer could create. In case of them, two workarounds are provided

Workaround 1

In case you don't want to declare a property that holds the Each reference, create a normal Each timer in your method scope and return .stop/true whenever the owner instance is nil

Each(1).seconds.perform { [weak self] in
    guard let _ = self else { return .stop }

    print("timer called")
    return .continue
}

90% of closures will call self somehow, so this isn't so bad

Workaround 2

In case the first workaround wasn't enough, you can declare a property that holds the Each reference and call the stop() function whenever the owner is deallocated

final class ViewController: UIViewController {
    private let _timer = Each(1).seconds

    deinit {
        _timer.stop()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        _timer.perform {
            // do something and return. you can check here if the `self` instance is nil as for workaround #1
        }
    }
}

License

Each is released under the MIT license. See LICENSE for details.

About

Elegant ⏱ interface for Swift apps

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Swift 95.2%
  • Ruby 4.8%