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