我試圖在JournalEntryVC.swift中添加與患者相關的不同日記條目。Realm-更新對象數組中的所有項目而不是僅添加新項目
我的病人類有軸頸的陣列條目即let journalEntries = List<Journal>()
我的期刊類具有表示日記條目即屬性entryType
,entryDate
和entryCaption
性質。
但是,當我在JournalEntryVC.swift中循環JSON時,我的附加日記帳分錄的屬性也被最近的日記帳分錄屬性替換,而不是僅將新日記帳分錄對象追加到日記帳分錄newPatient.journalEntries.append(myJournal)
的數組中。
例如,newPatient.journalEntries[0]
與entryCaption
和entryType
具有相同的字符串值,如newPatient.journalEntries[1]
等。
主要問題:關於如何添加新日記條目及其屬性但不更改之前附加日記條目的日記條目屬性的任何想法?
謝謝!
// Patient.swift
import Foundation
import RealmSwift
class Patient: Object {
dynamic var patientName = ""
dynamic var patientAvatar = ""
dynamic var patientId = 0
dynamic var isDietitian = false
//array of journal entries for each patient
let journalEntries = List<Journal>()
override class func primaryKey() -> String {
return "patientId"
}
}
// Journal.swift
import Foundation
import RealmSwift
class Journal: Object {
dynamic var entryId = ""
dynamic var entryType = ""
dynamic var entryImg = ""
dynamic var entryCaption = ""
dynamic var entryComment = ""
dynamic var entryCategory = ""
dynamic var entryDate = ""
override class func primaryKey() -> String {
return "entryId"
}
}
//JournalEntryVC.swift
import UIKit
import Alamofire
import BXProgressHUD
import SwiftyJSON
import RealmSwift
class JournalEntryVC: UIViewController, UITableViewDelegate, UITableViewDataSource {
func reloadInitialData () {
//mutable arrays containing journal entry attributes
desc.removeAllObjects()
type.removeAllObjects()
category.removeAllObjects()
metric_stat.removeAllObjects()
entryImages.removeAllObjects()
dateCreate.removeAllObjects()
comments.removeAllObjects()
entryType.removeAllObjects()
id.removeAllObjects()
//comments.removeAllObjects()
content.removeAllObjects()
patName.removeAllObjects()
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
let request = Alamofire.request(.GET, "https://gethealthie.com/entries.json", headers: [
"access-token": userCreds.objectForKey("access-token")! as! String,
"client": userCreds.objectForKey("client")! as! String,
"token-type": userCreds.objectForKey("token-type")! as! String,
"uid": userCreds.objectForKey("uid")! as! String,
"expiry": userCreds.objectForKey("expiry")! as! String
]).responseJSON { response in
print(response.response)
let json = JSON(data: response.data!)
if json.count == 0 {
BXProgressHUD.hideHUDForView(self.view);
}else {
//Realm- create object instances of Patient and Journal class
let newPatient = Patient()
let myJournal = Journal()
for i in 0 ..< json.count {
let entry = json[i]
print(entry)
let name = entry["entry_comments"]
let k = name["id"]
//add entry attributes to mutable arrays
self.type.addObject(entry["type"].stringValue)
self.desc.addObject(entry["description"].stringValue)
self.category.addObject(entry["category"].stringValue)
self.metric_stat.addObject(entry["metric_stat"].stringValue)
self.dateCreate.addObject(entry["created_at"].stringValue)
self.comments.addObject(entry["entry_comments"].rawValue)
self.entryType.addObject(entry["category"].stringValue)
let posterInfo = entry["poster"]
let first = posterInfo["first_name"].stringValue
let last = posterInfo["last_name"].stringValue
let full = first + " " + last
self.patName.addObject(full)
self.id.addObject(entry["id"].stringValue)
self.entryImages.addObject(entry["image_url"].stringValue)
//Realm- access properties in Journal class and set it equal to the current journal entry attribute i.e. json[i]
myJournal.entryType = entry["type"].stringValue
myJournal.entryCaption = entry["description"].stringValue
myJournal.entryCategory = entry["category"].stringValue
myJournal.metricStat = entry["metric_stat"].stringValue
myJournal.entryDate = entry["created_at"].stringValue
// myJournal.entryComment = entry["entry_comments"].rawValue as! String
//append a NEW journal entry to the array of journal entries in Patient class i.e. let journalEntries = List<Journal>() as the json loops thru different journal entries
newPatient.journalEntries.append(myJournal)
if i == json.count - 1 {
// do some task
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
BXProgressHUD.hideHUDForView(self.view)
}
}
}
//Realm- add newPatient object instance to realm
try! self.realm.write {
self.realm.add(newPatient)
}
}
}
}
}
}
非常感謝您的幫助!我是Swift和Realm的新手,所以你推動我朝着正確的方向前進。另外,我注意到數據不會在啓動之間持續。根據Realm的文檔,你必須在一個寫事務中添加一個對象到一個Realm中,以便它能夠持久化,我相信我在上面做了。有沒有其他原因可能導致它在啓動之間不存在(即強制退出應用程序並再次啓動)? – mir
這可能是因爲你在後臺線程中執行寫操作,但是使用'self.realm',我猜測它是在主線程上實例化的。你可以簡單地做一個'let realm = try! Realm()'並使用該對象在你的線程中進行寫操作。這裏詳細討論了這個問題:https://realm.io/docs/swift/latest/#threading – emb
只是爲了澄清,即使在飛機模式下強制退出然後再次啓動後,我仍然試圖保留數據在飛機模式下(不確定這是否是有效的用例)。雖然數據持續存在,並且我可以在啓動應用程序(使用WiFi)並切換到飛行模式時使用領域對象來顯示它,但在我強制退出後(在飛行模式下)它似乎不會持續存在,並在飛機模式下再次啓動。我試圖讓「realm = try!」 Realm()'按照您的建議在我自己的主題中編寫,但似乎不適用於我的用例。 – mir