Swift 3.0+;iOS 10+;Singleton sharedInstance-在数据数组更改后更新UI(角度方式)

Swift 3.0+;iOS 10+;Singleton sharedInstance-在数据数组更改后更新UI(角度方式),ios,asynchronous,swift3,singleton,quickblox,Ios,Asynchronous,Swift3,Singleton,Quickblox,苏呜。。。。我是一名JS开发人员,我正在为iOS 10+构建一个Swift 3.0应用程序,我希望以与Angular 1.6+相同的方式与数据交互 以下是我的情况: 我有一个Singleton sharedInstance,其中包含webRTC会话的会话数据。sharedInstance的一个属性包含一个UInt数组,我需要更新一个UI元素(IBOutlet),向用户显示他们在任何给定时刻都可以调用的可用对手 在angular中,我只需更新模型,视图/用户界面就会自动更改。。。砰砰。。。完成 我

苏呜。。。。我是一名JS开发人员,我正在为iOS 10+构建一个Swift 3.0应用程序,我希望以与Angular 1.6+相同的方式与数据交互

以下是我的情况:

我有一个Singleton sharedInstance,其中包含webRTC会话的会话数据。sharedInstance的一个属性包含一个UInt数组,我需要更新一个UI元素(IBOutlet),向用户显示他们在任何给定时刻都可以调用的可用对手

在angular中,我只需更新模型,视图/用户界面就会自动更改。。。砰砰。。。完成

我希望在Swift 3.0中创建相同的行为,因此这里有一些代码:

class Singleton {

    static let sharedInstance = Singleton()

    var session = (
        peers: [UInt]()
    )

    private init() { }
}
这是控制器:

class ViewController: UIViewController {

    @IBOutlet weak var UIPeerList: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        UIPeerList.text = String(describing: Singleton.sharedInstance.session.peers)
        self.updatePeerList(room: roomName, completion: {(oUser: AnyObject) -> Void in
            QBRequest.dialogs(
                for: QBResponsePage(limit: 100, skip: 0),
                extendedRequest: [roomName : "name"],
                successBlock: {(
                    response: QBResponse,
                    dialogs: [QBChatDialog]?,
                    dialogsUsersIDs: Set<NSNumber>?,
                    page: QBResponsePage?
                ) -> Void in
                    print("<------------------------------<<< Successfully found chat dialog - " + roomName)
                }, errorBlock: { (response: QBResponse) -> Void in
                    print("<------------------------------<<< Handle Error finding chat dialog - " + roomName)
                    let chatDialog: QBChatDialog = QBChatDialog(dialogID: nil, type: QBChatDialogType.group)
                    //chatDialog.occupantIDs = []
                    //chatDialog.occupantIDs?.append(NSNumber(value: DataModel.sharedInstance.qbLoginParams.id))
                    //chatDialog.occupantIDs?.append(12186)
                    chatDialog.setValue(roomName, forKey: "Name")
                    QBRequest.createDialog(chatDialog, successBlock: {(response: QBResponse?, createdDialog: QBChatDialog?) in
                        print("<------------------------------<<< Success creating chat dialog")
                        print(response ?? "No Response")
                        print(createdDialog ?? "No Created Dialog")
                    }, errorBlock: {(response: QBResponse!) in
                        print("<------------------------------<<< Error creating chat dialog")
                        print(response ?? "No Response")
                    })
                }
            )
        })
类ViewController:UIViewController{
@IBOutlet弱变量UIPeerList:UILabel!
重写func viewDidLoad(){
super.viewDidLoad()
UIPeerList.text=String(描述:Singleton.sharedInstance.session.peers)
updatePeerList(房间:roomName,完成:{(USER:AnyObject)->中的Void
QBRequest.dialogs(
对于:QB响应(限制:100,跳过:0),
extendedRequest:[roomName:“name”],
成功块:{(
答复:qbr答复:,
对话框:[QBChatDialog]?,
对话框SUSERSIDS:设置?,
页码:QB海绵分离?
)->在

打印(我想到的一个解决方案是使用委托。不过可能还有更优雅的解决方案

要使用委派,您可以执行以下步骤:

1-创建一个具有一个方法的协议
update()
,并将该协议命名为
UpdateUIDelegate

2-使您的
ViewController
实现该协议,并以您想要的方式实现
update()
方法

3-将
ViewController
对象设置为
Singleton
类中的属性


4-通过
Singleton
中的方法进行所有影响
Singleton.sharedInstance.session.peers
的更改,并使该方法最终调用您的学员的更新方法。

Hrrmmm…听起来很可靠…介意与您刚刚接触到的美味知识分享一些代码吗?随意切碎什么我有上面提到的。在Swift中,有多线程、数据竞争等等,对于“boom-bang-done”也有类似的行为,这就是“boom-bang-crash”;)所以,我想说的是,确保在访问“共享”变量的地方进行适当的同步。这不是真的吗
func updatePeerList( room: String, completion: @escaping (_ response: AnyObject) -> ()) {
        QBRequest.users(
            withTags: [room],
            page: QBGeneralResponsePage(currentPage: 1, perPage: 10),
            successBlock: {( response: QBResponse, page: QBGeneralResponsePage?, users: [QBUUser]? ) -> Void in
                guard users != nil else { return }
                print("<------------------------------<<< Success getting users with room tag - "+room)
                DataModel.sharedInstance.sessionInfo.peers.removeAll()
                for object in users! {
                    DataModel.sharedInstance.sessionInfo.peers.append(object.id)
                }
                DispatchQueue.main.async { completion(response) }
            }, errorBlock: {(response: QBResponse!) in
                print("<------------------------------<<< Error getting users with room tag - "+room)
                print(response)
                DispatchQueue.main.async { completion(response) }
            }
        )
    }