在开始实时流之后,让UITableView刷新用户

时间:2017-02-26 17:07:40

标签: ios swift uitableview swift3 hls

我正在处理的应用程序的登录页面有一个占位符头像,以当没有用户主动直播时存在的应用程序命名(使用Red5 Pro流式传输框架)。

然而当某人 开始流式传输时,我希望它自动刷新tableview并显示新用户的头像。我到目前为止所写的作品有些作品,但并非完全如此。当有人开始直播时,占位符头像确实消失,但流媒体的头像的用户不会出现。

如果我关闭应用并重新打开它,则会正确显示。这是我在Swift 3中的代码,我做错了什么?是否应将刷新调用移出ViewDidLoad?我是否错误地使用Dispatch Queue?感谢

import UIKit
import Firebase

class HomeController: UIViewController, UITableViewDataSource,     UITableViewDelegate, cellDelegate {

@IBOutlet var tableView: UITableView!
var stream: String!
var top: [SSStream] = []
var recent: [SSStream] = [SSStream()]
var trending: [SSStream] = [SSStream()]
var ref: FIRDatabaseReference!

override func viewDidLoad() {
    navigationItem.title = "Swiffshot"
    navigationController?.navigationBar.isTranslucent = false
    let settings = UIButton(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
    settings.setImage(#imageLiteral(resourceName: "Settings"), for: .normal)
    settings.addTarget(self, action: #selector(settingsPressed), for: .touchUpInside)
    navigationItem.leftBarButtonItem = UIBarButtonItem(customView: settings)
    let friends = UIButton(frame: CGRect(x: 0, y: 0, width: 23, height: 20))
    friends.setImage(#imageLiteral(resourceName: "AllFriends"), for: .normal)
    friends.addTarget(self, action: #selector(friendsPressed), for: .touchUpInside)
    navigationItem.rightBarButtonItem = UIBarButtonItem(customView: friends)

    let nib = UINib(nibName: "MainHeader", bundle: Bundle.main)
    tableView.register(nib, forHeaderFooterViewReuseIdentifier: "MainHeader")

    ref = FIRDatabase.database().reference()


    if !SSContact.shared.active {
        performSegue(withIdentifier: "fromMainToAuth", sender: self)
    }

    SSContact.shared.load() { SSContact.shared.propertyCheck(self) { } }

//        SSContact.shared.subscribeToTop(pulse: { (streams) in
//            self.top.removeAll()
//            self.top.append(contentsOf: streams)
//            self.tableView.reloadSections(IndexSet(integer: 0), with:     .automatic)
//        })

    ref.child("streams").observe(.value, with: { (snapshot) in

        print("I ran")

        self.top.removeAll()
        if let userData = snapshot.value as? NSDictionary {
            for stream in userData {
                let newStream = SSStream()
                newStream.username = stream.key as! String
                print("Found stream \(stream.key as! String)")
                newStream.isPrivate = !((stream.value as! NSDictionary)["public"] as! Bool)
                newStream.views = (stream.value as! NSDictionary)["views"] as! Int
                newStream.isEnabled = true
                self.top.append(newStream)
            }
        }
        if self.top.isEmpty {
            print("No Streams Found")
            self.top.append(SSStream())
        }
        DispatchQueue.main.async {
            self.tableView.reloadSections(IndexSet(integer: 0), with: .automatic)
            self.tableView.reloadData()
        }
    })
}

func cellGotPressed(_ stream: String) {
    self.stream = stream
    performSegue(withIdentifier: "toPlayer", sender: self)
}

func settingsPressed() {
    performSegue(withIdentifier: "toSettings", sender: self)
}

func friendsPressed() {
    performSegue(withIdentifier: "fromMainToExpandable", sender: self)
}

func cameraTapped() {
    performSegue(withIdentifier: "toRed", sender: self)
}

func cellTapped() {
    print("Cell Tapped")
}

// MARK: Segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toPlayer" {
        let player = segue.destination as! VideoPlayerViewController
        player.isSubscribing = true
        player.stream = stream
    }
}

// MARK: Table View Functions

func numberOfSections(in tableView: UITableView) -> Int {
    return 3
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "big") as! CategoryRow
        cell.section = indexPath.section
        cell.top = top
        cell.delegate = self
        cell.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(cameraTapped)))
        return cell
    } else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "small") as! CategoryRow
        cell.section = indexPath.section
        cell.recent = recent
        cell.trending = trending
        cell.delegate = self
        return cell
    }
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if section == 0 {
        return nil
    } else {
        let cell = self.tableView.dequeueReusableHeaderFooterView(withIdentifier: "MainHeader")
        let header = cell as! MainHeader
        if section == 1 {
            header.fillHeader("RECENT")
        } else if section == 2 {
            header.fillHeader("Trending + Now")
        } else {
            print("Unknown Section")
        }
        return header
    }
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if indexPath.section == 0 {
        return 300
    } else {
        return 100
    }
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return 0
    } else {
        return 50
    }
}

func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
    return 50
}
}

1 个答案:

答案 0 :(得分:0)

我意识到我需要做什么。我需要设置

ref.child("streams").observe

在Dispatch.Queue的调用中。通过在调度调度之前设置引用,程序没有正确同步。它应该是这样的:

DispatchQueue.main.async {
ref.child("streams").observe(.value, with: { (snapshot) in
        self.tableView.reloadSections(IndexSet(integer: 0), with: .automatic)
        self.tableView.reloadData()
    }
})