【发布时间】:2018-04-26 06:41:56
【问题描述】:
到目前为止的成功:我有一个远程数据源。数据被动态拉入视图控制器。该数据用于在每个可重用的自定义单元格上命名 .title 和 .subtitle。此外,每个自定义单元格都有一个 UISwitch,我已经能够使用它来发送推送通知的“订阅”信号(对于由单元格的标题/副标题标识的给定组)和“取消订阅”信号以及.
我剩下的一个问题:每当用户“重新访问”设置 VC,而我的代码正在“重置” UISwitches 时,它会在 Xcode 9.2 中导致以下警告:
- UISwitch.on 必须在主线程中使用
- UISwitch.setOn(_:animated:) 只能在主线程中使用
- -[UISwitch setOn:animated:notifyingVisualElement:] 必须在主线程中使用
下面的代码“工作”——但是所需的结果发生得相当慢(确实应该“打开”的 UISwitches 需要很长时间才能最终切换到“打开”)。
更多详情: 需要什么:无论何时显示或“重新显示”VC,如果用户订阅了给定的组,我需要将自定义单元格的 UISwitch“重置”为“on”,如果用户订阅了该组,则“重置”为“off”未订阅。理想情况下,每次显示 VC 时,都应该使用 OneSignal.getTags() 函数访问 OneSignal 服务器并找出用户对每个组的“订阅状态”。我有那部分工作。此代码在 VC 中。但我需要以正确的方式进行操作,以适应有关线程的正确协议。
- VC 文件,“ViewController_13_Settings.swift”包含一个带有可重用自定义单元格的表格视图。
- 表格视图文件名为“CustomTableViewCell.swift”
- 自定义单元格称为“customCell”(我知道,我的名字都很有创意)。
自定义单元格(在 XIB 中设计)只有三个项目:
- 标题 – 显示的“组”的“友好名称”,要订阅或取消订阅。从远程数据源设置
- Subtitle – 上述组的隐藏“数据库名称”。对用户隐藏。从远程数据源设置。
- UISwitch - 命名为“switchMinistryGroupList”
如何以编程方式正确设置 UISwitch?
这是 ViewController_13_Settings.swift 中似乎相关的代码:
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! CustomTableViewCell
// set cell's title and subtitle
cell.textLabelMinistryGroupList?.text = MinistryGroupArray[indexPath.row]
cell.textHiddenUserTagName?.text = OneSignalUserTagArray[indexPath.row]
// set the custom cell's UISwitch.
OneSignal.getTags({ tags in
print("tags - \(tags!)")
self.OneSignalUserTags = String(describing: tags)
print("OneSignalUserTags, from within the OneSignal func, = \(self.OneSignalUserTags)")
if self.OneSignalUserTags.range(of: cell.textHiddenUserTagName.text!) != nil {
print("The \(cell.textHiddenUserTagName.text!) UserTag exists for this device.")
cell.switchMinistryGroupList.isOn = true
} else {
cell.switchMinistryGroupList.isOn = false
}
}, onFailure: { error in
print("Error getting tags - \(String(describing: error?.localizedDescription))")
// errorWithDomain - OneSignalError
// code - HTTP error code from the OneSignal server
// userInfo - JSON OneSignal responded with
})
viewWillAppear(true)
return cell
}
}
在 VC 代码的上述部分中,这部分(下)是起作用的,但显然不是以正确使用线程的方式:
if OneSignalUserTags.range(of: cell.textHiddenUserTagName.text!) != nil {
print("The \(cell.textHiddenUserTagName.text!) UserTag exists for this device.")
cell.switchMinistryGroupList.isOn = true
} else {
cell.switchMinistryGroupList.isOn = false
}
【问题讨论】: