You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
5.1 KiB
147 lines
5.1 KiB
////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright 2014 Realm Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
import UIKit
|
|
import RealmSwift
|
|
|
|
class DemoObject: Object {
|
|
@objc dynamic var title = ""
|
|
@objc dynamic var date = NSDate()
|
|
}
|
|
|
|
#if !swift(>=4.2)
|
|
extension UITableViewCell {
|
|
typealias CellStyle = UITableViewCellStyle
|
|
typealias EditingStyle = UITableViewCellEditingStyle
|
|
}
|
|
#endif
|
|
|
|
class Cell: UITableViewCell {
|
|
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String!) {
|
|
super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
|
|
}
|
|
|
|
required init(coder: NSCoder) {
|
|
fatalError("NSCoding not supported")
|
|
}
|
|
}
|
|
|
|
class TableViewController: UITableViewController {
|
|
|
|
let realm = try! Realm()
|
|
let results = try! Realm().objects(DemoObject.self).sorted(byKeyPath: "date")
|
|
var notificationToken: NotificationToken?
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
|
|
setupUI()
|
|
|
|
// Set results notification block
|
|
self.notificationToken = results.observe { (changes: RealmCollectionChange) in
|
|
switch changes {
|
|
case .initial:
|
|
// Results are now populated and can be accessed without blocking the UI
|
|
self.tableView.reloadData()
|
|
break
|
|
case .update(_, let deletions, let insertions, let modifications):
|
|
// Query results have changed, so apply them to the TableView
|
|
self.tableView.beginUpdates()
|
|
self.tableView.insertRows(at: insertions.map { IndexPath(row: $0, section: 0) }, with: .automatic)
|
|
self.tableView.deleteRows(at: deletions.map { IndexPath(row: $0, section: 0) }, with: .automatic)
|
|
self.tableView.reloadRows(at: modifications.map { IndexPath(row: $0, section: 0) }, with: .automatic)
|
|
self.tableView.endUpdates()
|
|
break
|
|
case .error(let err):
|
|
// An error occurred while opening the Realm file on the background worker thread
|
|
fatalError("\(err)")
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
// UI
|
|
|
|
func setupUI() {
|
|
tableView.register(Cell.self, forCellReuseIdentifier: "cell")
|
|
|
|
self.title = "TableView"
|
|
self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "BG Add", style: .plain,
|
|
target: self, action: #selector(backgroundAdd))
|
|
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add,
|
|
target: self, action: #selector(add))
|
|
}
|
|
|
|
// Table view data source
|
|
|
|
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
|
return results.count
|
|
}
|
|
|
|
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
|
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! Cell
|
|
|
|
let object = results[indexPath.row]
|
|
cell.textLabel?.text = object.title
|
|
cell.detailTextLabel?.text = object.date.description
|
|
|
|
return cell
|
|
}
|
|
|
|
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
|
|
if editingStyle == .delete {
|
|
realm.beginWrite()
|
|
realm.delete(results[indexPath.row])
|
|
try! realm.commitWrite()
|
|
}
|
|
}
|
|
|
|
// Actions
|
|
|
|
@objc func backgroundAdd() {
|
|
// Import many items in a background thread
|
|
DispatchQueue.global().async {
|
|
// Get new realm and table since we are in a new thread
|
|
autoreleasepool {
|
|
let realm = try! Realm()
|
|
realm.beginWrite()
|
|
for _ in 0..<5 {
|
|
// Add row via dictionary. Order is ignored.
|
|
realm.create(DemoObject.self, value: ["title": TableViewController.randomString(), "date": TableViewController.randomDate()])
|
|
}
|
|
try! realm.commitWrite()
|
|
}
|
|
}
|
|
}
|
|
|
|
@objc func add() {
|
|
realm.beginWrite()
|
|
realm.create(DemoObject.self, value: [TableViewController.randomString(), TableViewController.randomDate()])
|
|
try! realm.commitWrite()
|
|
}
|
|
|
|
// Helpers
|
|
|
|
class func randomString() -> String {
|
|
return "Title \(arc4random())"
|
|
}
|
|
|
|
class func randomDate() -> NSDate {
|
|
return NSDate(timeIntervalSince1970: TimeInterval(arc4random()))
|
|
}
|
|
}
|
|
|