forked from Yalantis/DBClient
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMasterViewController.swift
More file actions
108 lines (78 loc) · 3.35 KB
/
Copy pathMasterViewController.swift
File metadata and controls
108 lines (78 loc) · 3.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//
// MasterViewController.swift
// DBClient-Example
//
// Created by Serhii Butenko on 11/1/17.
// Copyright © 2017 Yalantis. All rights reserved.
//
import UIKit
import DBClient
class MasterViewController: UITableViewController, DBClientInjectable {
fileprivate var objects = [User]()
private var userChangesObservable: RequestObservable<User>?
override func viewDidLoad() {
super.viewDidLoad()
let observable = dbClient.observable(for: FetchRequest<User>(sortDescriptor: NSSortDescriptor(key: "name", ascending: true)))
observable.observe { [weak self] changeSet in
self?.observeChanges(changeSet)
}
userChangesObservable = observable
navigationItem.leftBarButtonItem = editButtonItem
}
// MARK: - Segues
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == "showDetail",
let controller = segue.destination as? DetailViewController else {
fatalError()
}
if let indexPath = tableView.indexPathForSelectedRow {
let object = objects[indexPath.row]
controller.detailItem = object
}
}
// MARK: - Actions
@IBAction private func addObject(_ sender: Any) {
dbClient.insert(User.createRandom())
}
private func observeChanges(_ changeSet: ObservableChange<User>) {
switch changeSet {
case .initial(let initial):
objects.append(contentsOf: initial)
tableView.reloadData()
case .change(let change):
self.objects = change.objects
tableView.beginUpdates()
let insertedIndexPaths = change.insertions.map { IndexPath(row: $0.index, section: 0) }
tableView.insertRows(at: insertedIndexPaths, with: .automatic)
let deletedIndexPaths = change.deletions.map { IndexPath(row: $0, section: 0) }
tableView.deleteRows(at: deletedIndexPaths, with: .automatic)
let updatedIndexPaths = change.modifications.map { IndexPath(row: $0.index, section: 0) }
tableView.reloadRows(at: updatedIndexPaths, with: .automatic)
tableView.endUpdates()
case .error(let error):
print("Got an error: \(error)")
}
}
}
// MARK: - Table View
extension MasterViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objects.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let object = objects[indexPath.row]
cell.textLabel!.text = object.name
return cell
}
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
guard editingStyle == .delete else {
return
}
let user = objects[indexPath.row]
dbClient.delete(user)
}
}