Execute closure just once!!! Once is a micro framework.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
Demo
Once.xcodeproj
Once
.gitignore
.swift-version
LICENSE
Package.swift
README.md

README.md

Once

GitHub release Language Carthage Compatible Swift Package Manager

Execute closure once!!! Once is a micro framework.

import Once

class ViewController: UIViewController {
    private var dataSource = DataSource()
    lazy var onceReloader: OnceClosure = execute_once {
        print("execute once")
        self.dataSource.reload()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        onceReloader?()   
    }
}

Legacy...

class ViewController: UIViewController {
    private var dataSource = DataSource()
    private var callFirst = true

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if callFirst {
            reloadOnce()
            callFirst = falee
        }
    }

    func reloadOnce() {
        print("execute once")
        self.dataSource.reload()
    }    
}

Features

  • Execute closure just once.
  • Don't need to have any flags that closure called or not.
  • This function doesn't capture any objects by using no-escaped closure.
    • You don't have to use [weak self], [unowned self].
  • Micro library!

How to use

    1. Import framework

import Once

    1. Define lazy var instance.
      Note: Don't forget to write parameter: OnceClosure
class ViewController: UIViewController {
    // as closure
    lazy var onceReloader: OnceClosure = execute_once {
        print("execute once")
        self.dataSource.reload()
    }

    // or function    
    lazy var onceReloader2: OnceClosure = self.reloadOnce()

    func reloadOnce() -> OnceClosure {
        return execute_once {
            print("execute once")
            self.dataSource.reload()
        }
    }
}
    1. Execute once closure!! (need ?)
class ViewController: UIViewController {
    // ...
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        onceReloader?()
    }
}

Caution

Once-closure will not work anymore if it is assigned nil before executing.

import Once

class ViewController: UIViewController {
    private var dataSource = DataSource()
    lazy var onceReloader: OnceClosure = execute_once {
        print("execute once")
        self.dataSource.reload()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        onceReloader = nil
        onceReloader?() // doesn't work.
    }
}

Requirements

  • iOS 8.0+
  • Xcode 8+
  • Swift 3

Installation

You can install with carthage or SPM.

Carthage

  • Add the following to your Cartfile:
github 'sgr-ksmt/once'
  • Then run command.

Communication

  • If you found a bug, please open an issue. 🙇
  • Also, if you have a feature request, please open an issue. 👍
  • If you want to contribute, submit a pull request.💪

License

Once is under MIT license. See the LICENSE file for more info.