我们可以在 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 不单击

Swift - 以编程方式从集合视图中选择第一个项目

我们可以在 ios swift 的 indexpath 的 didSelectRow 中异步调用 api

我们需要在Swift 3中使用哪个Pod来实现iOS中的图表?

使用 MLKit ios swift 尝试化妆