我使用了 XMPPFramework ,因为用户身份验证和仅接收邮件是使用XMPP完成的。我正在使用 RestApi 发送消息。我使用 SwiftyXMLParser 库解析了收到的xml邮件,现在我必须在 Realm 数据库中存储'senderName','messageBody','time','senderNumber'。
最初,ContactsViewController中的tableView为空。当用户发送消息时,它将首先存储在数据库中,然后我必须在tableViewCell中显示发送者的号码/名称和messageBody。如果同一用户发送消息,则只需更新messageBody文本。如果不同的用户发送消息,请检查db中是否存在用户,如果没有,请在tableView中添加用户等等...检查用户是否有每条消息,并同样填充tableView。
这是我到目前为止所做的:
class ContactsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
var messagesArray:[String] = [String]()
var messageBody : [String] = [String]()
var realm : Realm!
var userInfo = MessageData()
// viewDidLoad() // assign tableView delegate, datasource and register the Nib.
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return messagesArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = contactsTableView.dequeueReusableCell(withIdentifier: "contactscell", for: indexPath) as! ContactsListCell
cell.userNameLabel.text = messagesArray[indexPath.row]
cell.userImageView.image = UIImage(named: "default-user")
cell.messageBodyLabel.text = messageBody[indexPath.row]
return cell
}
} // end of class
extension ContactsViewController: XMPPStreamDelegate {
func xmppStream(_ sender: XMPPStream, didReceive message: XMPPMessage) {
let string = message.prettyXMLString()
let xml = try! XML.parse(string!)
let messageSenderNo = xml["message"]["data”][“phoneNumber”].text
let senderName = xml["message"]["data”][“name”].text
let messageText = xml["message"]["data”][“text”].text
let messageTime = xml["message"]["data"]["time"].text
userInfo.messageFrom = messageSenderNo
userInfo.messageBody = messageText
userInfo.senderName = senderName
realm = try! Realm()
try! realm.write {
realm.add(userInfo, update: true)
}
let senderOfMsg:[String] = realm.objects(MessageData.self).value(forKey: "messageFrom") as! [String]!
let textMessage:[String] = realm.objects(MessageData.self).value(forKey: "messageBody") as! [String]!
messagesArray = senderOfMsg
messageBody = textMessage
}
}
这是我的消息类:
class MessageData: Object{
dynamic var messageFrom:String = ""
dynamic var messageBody:String = ""
dynamic var messageTime:String = ""
dynamic var messageSenderName:String = ""
override static func primaryKey() -> String? {
return "messageFrom"
}
convenience init(messageFrom: String, messageBody: String, messageSenderFirstName: String, messageSenderLastName: String, message_id: String, messageTime: String){
self.init()
self.messageFrom = messageFrom
self.messageBody = messageBody
self.messageTime = messageTime
self.messageSenderName = messageSenderName
}
}
我第一次使用Realm,所以我不知道如果我做了一些致命的错误。如果所有数据都保存在领域数据库中。 tableView应该是第一次空白,但是在数据库中有数据之后,tableView必须显示联系人和messageBody。它应该显示先前的消息(如果有的话),就像用户再次启动应用程序时的 WhatsApp 一样。 tableView中的数据应该保持不变。请告诉我我做错了什么或没做过。谢谢你的时间。
答案 0 :(得分:1)
简而言之,您需要致电messagesArray
reloadData()
method(或其中一个methods to insert, remove, or delete rows;请参阅"插入,删除和移动行章节"部分),每当您更改后备数据时。在这种情况下,这意味着当您在messagesBody
方法中为xmppStream()
和reloadData()
设置新值时,需要调用messagesArray
或类似方法才能告诉表格查看其数据源已更新,并且需要显示新数据。
更具体地说:messagesBody
和tableView(_:, cellForRowAt:)
甚至不是必需的。只需使用您的Realm作为后备存储。您可以将消息写入Realm中的List
,然后List
方法可以直接调用模型对象并从中加载数据。然后,您可以在<ul class=" nav nav-tabs " role="tablist">
<li class="tab-link" *ngFor="let tab of tabsdata;let i = index;let frst=first" [ngStyle]="{'width': 'calc(100% /' + tabsdata.length + ')'}">
<a (click)="tabsUL($event);" href="#tab-{{i+1}}" role="tab">{{tab}}</a>
</li>
</ul>
上注册collection notifier,以便每当更改时,您的应用程序都会自动得到通知。然后,通知程序中的代码可以重新加载表视图。