我们可以在 ios swift 的 indexpath 的 didSelectRow 中异步调用 api
Posted
技术标签:
【中文标题】我们可以在 ios swift 的 indexpath 的 didSelectRow 中异步调用 api【英文标题】:Can we call api asynchronously in didSelectRow at indexpath in ios swift 【发布时间】:2018-09-05 07:34:35 【问题描述】:我想使用一些 id 从 didSelectRowat indexpath 调用 api,根据 api 的响应,我需要移动到不同的屏幕。
func tableView(_tableView: UITableView, didSelectRowAt indexPath: IndexPath)
let contactDB : FMDatabase!
contactDB = FMDatabase(path: databasePath!)
if contactDB != nil
if contactDB.open()
let read:Int = 1
let campaignID = self.notification_details[indexPath.row].userId
let querySQL = "UPDATE new_notifications SET read = \(read) WHERE from_id = \"\(campaignID)\""
let results:FMResultSet? = contactDB.executeQuery(querySQL,withArgumentsIn: nil)
contactDB.close()
let cell = tableView.cellForRow(at: indexPath)
cell?.layer.backgroundColor = UIColor.clear.cgColor
if self.notification_details[indexPath.row].notification_type == "LIVE"
DispatchQueue.main.async
NotificationCenter.default.post(name: Notification.Name("live_notification_notificationtab"), object: self.notification_details[indexPath.row].campaign_id)
【问题讨论】:
使用 tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath),如果你需要更多帮助来展示你的作品 是的,你可以这样做,使用 dispatch.async 【参考方案1】:是的,我们可以。但是您要么需要在异步调用进行时阻止用户交互,要么需要在用户交互时中断异步调用。
为了防止用户交互,最简单的方法是在整个表格视图上添加另一个视图,在其上添加一些活动指示器并将其默认隐藏。然后假设是这样的:
func userSelectedItem(_ item: MyObject)
progressBackground?.isHidden = false
progressActivityIndicator?.startAnimating()
MyObject.fetchDetails(id: item.id) detailedObject in
self.navigationController?.pushViewController(DetailedObjectViewController(detailedObject), animated: true)
self.progressBackground?.isHidden = true
self.progressActivityIndicator?.stopAnimating()
这将被称为:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
userSelectedItem(items[indexPath.row])
但这一切都取决于您如何实现表格视图。
无论如何,您可能需要中断某些事件的操作。例如,如果用户在异步操作正在进行时导航到另一个屏幕,您可能希望在获取完成后阻止调用。最直接的过程是使用像var isVisible: Bool = false
这样的变量,然后在视图上设置为true
并在视图上设置为false
将消失。然后,您可以在推送新视图控制器并决定是否导航的块内使用此属性。
【讨论】:
【参考方案2】:是的,你当然可以,但是,让我们分析一下什么是最好的方法。 假设您在表格视图中呈现了一些信息。一位用户选择了您想要访问 API 的行,但 API 响应需要时间从服务器传输到您的设备,所以在此期间用户会做什么?如果您允许用户与 UI 交互,他/她可以滚动屏幕并可以选择其他一些行,因此允许用户与 API 交互不是一个好主意,而是应该阻止用户使用应用程序,直到你会得到响应,所以正确的做法是使用一些加载器或指示器阻止用户,然后进行异步调用。
【讨论】:
以上是关于我们可以在 ios swift 的 indexpath 的 didSelectRow 中异步调用 api的主要内容,如果未能解决你的问题,请参考以下文章
我们可以在部署目标小于 iOS 7 的应用程序中集成 swift 的代码吗?
Swift:以编程方式在 UICollectionViewCell 中的 IndexPath 中的多个 UIButton,下一个 addTarget 不单击
我们可以在 ios swift 的 indexpath 的 didSelectRow 中异步调用 api