gpt4 book ai didi

ios - Swift 3.0 + iOS 10 + Singleton共享实例 - 数据数组更改后更新UI(Angular方式)

转载 作者:行者123 更新时间:2023-11-29 00:23:07 26 4
gpt4 key购买 nike

Soooo....我是一名 JS 开发人员,我正在使用 Swift 3.0 为 iOS 10+ 构建应用程序,我想以与在 Angular 1.6+ 中相同的方式与数据交互...

这是我的情况:

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

在角度上,我会更新模型, View /UI 会自动更改...砰砰...完成...

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

class Singleton {

static let sharedInstance = Singleton()

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

private init() { }
}

这是 Controller :

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")
})
}
)
})

所以在上面的 Controller 中,我在触发 viewDidLoad 后立即将 UI 元素设置为数据源(我知道这不是当前正在发生的事情。)现在每当我更改 Singleton.sharedInstance.session.peers 数据模型时例如,在此 ASYNC API 请求中,我希望 UI 更新:

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) }
}
)
}

How do I achieve such a feat?

注意:我相信这是可能的,因为我研究了 UISwitch 方法,但是它并没有像我想要的那样工作..

最佳答案

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

要使用委托(delegate),您可以通过以下步骤:

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

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

3- 将您的 ViewController 对象设置为 Singleton 类中的一个属性。

4- 使所有影响 Singleton.sharedInstance.session.peers 的更改通过 Singleton 中的方法发生,并使该方法在其末尾调用委托(delegate)的更新方法.

关于ios - Swift 3.0 + iOS 10 + Singleton共享实例 - 数据数组更改后更新UI(Angular方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43809657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com