Skip to content

Instantly share code, notes, and snippets.

@sisoje
sisoje / DeinitBlock.swift
Last active August 18, 2020 15:01
Resource acquisition is initialization (RAII) in Swift: Implementation
class DeinitBlock {
let onDeinit: () -> Void
init(_ block: @escaping () -> Void) {
onDeinit = block
}
deinit {
onDeinit()
}
}
@sisoje
sisoje / DeinitBlock+URLSessionDataTask.swift
Last active February 1, 2019 13:43
Resource acquisition is initialization (RAII) in Swift: Example
extension URLSessionDataTask {
var cancellation: DeinitBlock {
return DeinitBlock { [weak self] in
self?.cancel()
}
}
}
@sisoje
sisoje / DeinitBlock+URLImageTableViewCell.swift
Last active February 1, 2019 13:47
Resource acquisition is initialization (RAII) in Swift: Example
class URLImageTableViewCell: UITableViewCell {
@IBOutlet weak var urlImageView: UIImageView!
var urlImageLoader: DeinitBlock?
// new task is created, old task cancelled automatically
func setImage(url: URL) {
urlImageLoader = urlImageView.setCachedImage(url: url)
}
}
@sisoje
sisoje / DeinitBlock+Timer.swift
Last active February 1, 2019 13:47
Resource acquisition is initialization (RAII) in Swift: Example
extension Timer {
var invalidation: DeinitBlock {
return DeinitBlock { [weak self] in
self?.invalidate()
}
}
}
import CoreData
public final class CoreDataStack {
public let persistentContainer: NSPersistentContainer
public init(_ persistentContainer: NSPersistentContainer) {
self.persistentContainer = persistentContainer
}
public private(set) lazy var mainContext: NSManagedObjectContext = {
extension NSManagedObjectContext {
func performTask(_ block: @escaping (NSManagedObjectContext) -> Void) {
perform { [unowned self] in
block(self)
}
}
}
extension NSFetchedResultsController {
var sectionCount: Int {
return sections?.count ?? 0
}
}
extension NSFetchedResultsController {
@objc func entity(at row: Int) -> ResultType {
object(at: IndexPath(item: row, section: 0))
}
}
class FetchedData<T: NSFetchRequestResult> {
let controller: NSFetchedResultsController<T>
init(_ controller: NSFetchedResultsController<T>) {
self.controller = controller
}
}
extension FetchedData {
subscript(_ indexPath: IndexPath) -> T {
return controller.object(at: indexPath)
}
}