TableView不加载领域数据库值

时间:2017-11-08 11:25:55

标签: database uitableview swift3 realm xmppframework

我使用了 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中的数据应该保持不变。请告诉我我做错了什么或没做过。谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

简而言之,您需要致电messagesArray reloadData() method(或其中一个methods to insert, remove, or delete rows;请参阅"插入,删除和移动行章节"部分),每当您更改后备数据时。在这种情况下,这意味着当您在messagesBody方法中为xmppStream()reloadData()设置新值时,需要调用messagesArray或类似方法才能告诉表格查看其数据源已更新,并且需要显示新数据。

更具体地说:messagesBodytableView(_:, 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,以便每当更改时,您的应用程序都会自动得到通知。然后,通知程序中的代码可以重新加载表视图。