在 for 循环中发出请求时返回 JSON

Posted

技术标签:

【中文标题】在 for 循环中发出请求时返回 JSON【英文标题】:JSON returning when making requests in a for loop 【发布时间】:2020-08-11 18:36:57 【问题描述】:

所以我在我的数组 for 循环 (loadSupporter(completion: @escaping(()->())) 中发出 GET 请求。它为每个循环获取正确的数据,除了最后 3-6 个循环。

import Foundation
import UIKit
 
class NotificationVC: Toolbar, UITableViewDelegate, UITableViewDataSource 
    var notifications:[NotificationViewModel] = [] 
        didSet 
            loadSupporter(completion: 
                self.myTableView.reloadData()
            )
        
       
    
    override func viewDidLoad() 
        loadNotifications()
    
    
    func loadNotifications() 
           print("loadNotifications")
           if let user_id = profile?.sub 
               let getNotifications = GETNotificationsByUserID(user_id: user_id)
               getNotifications.getNotifications  notifications in
                self.notifications = notifications.map  notification in
                let ret = NotificationViewModel()
                ret.mainNotification = notification
    
                return ret
             
           
        
      
    
    func loadSupporter(completion: @escaping(()->())) 
        let myGroup = DispatchGroup()
        var index:Int = 0
        for notification in self.notifications 
            myGroup.enter()
            if let supporter_id = notification.mainNotification?.supporter_id 
            GetUsersById2(id: supporter_id).getUser  user in
                self.notifications[index].supporter_info = user
                index += 1
            
                myGroup.leave()
            
                
        
      
        myGroup.notify(queue: .main) 
          completion()
       
    
 
 
//Web Service
import Foundation
 
class GetUsersById2 
 
    var id:String
    var dataTask:URLSessionDataTask?
    
    init(id:String) 
        self.id = id
    
    
    
    func getUser(completion: @escaping (UsersModel) -> ()) 
        
        
        var components = URLComponents()
           components.scheme = "https"
           components.host = "dev-owihjaep.auth0.com"
           components.path = "/api/v2/users/\(id)"
 
 
        let url = components.url
      
         guard let requestUrl = url else  fatalError() 
         var request = URLRequest(url: requestUrl)
         request.httpMethod = "GET"
        let accessToken = AccessToken().accessToken
        request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
 
        dataTask = URLSession.shared.dataTask(with: request)  data, _, error in
            
            if let error = error 
                print("Error Getusersbyid2 \(error)")
                return
            
            
            guard let data = data else 
                return
            
            guard let user = try? JSONDecoder().decode(UsersModel.self, from: data) else 
                print("Unable to decode responseData")
                return
            
            DispatchQueue.main.async 
                completion(user)
                print("GetUsersById2 user \(user)")
            
            
        
        dataTask?.resume()
        
    

我知道这不是 supporter_id 传递到 url,因为它们都是一样的。

【问题讨论】:

【参考方案1】:

不要自己管理索引变量,使用enumerated() API。

if let 检查之后运行enter

var index:Int = 0

for (index, notification) in self.notifications.enumerated() 
    if let supporter_id = notification.mainNotification?.supporter_id 
        myGroup.enter()
        GetUsersById2(id: supporter_id).getUser  user in
           self.notifications[index].supporter_info = user
           myGroup.leave()
        
        

【讨论】:

感谢您的回答。尽管对于某些循环,我仍然为零。有点混乱。 在任何情况下,您都必须在getUser 中调用completion(例如使用Result 类型),否则组计数器会混淆。 我以前从未在我的 GET 请求中使用过 Result,所以我不知道你的意思。您可以尝试在答案中写出代码吗? 否则将闭包类型声明为(UsersModel?) -> (),并将所有出现的return 替换为completion(nil); return。在完成处理程序中检查 UsersModel 是否不是 nil 而是调用 always leave “在完成处理程序中检查 UsersModel 是否不为零但调用总是离开”。这是什么意思?

以上是关于在 for 循环中发出请求时返回 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何发出 jsonp 请求

Java中 用ajax发出请求返回JOSN格式数据,中文乱码问题

来自 for 循环内的 AJAX 链中最后一个 AJAX 请求的返回值

在 vc++ 代码中使用 wininet Api 发出 json 发布请求时得到空白响应

发出 Axios GET 请求时出现无限循环 - 循环不会关闭

带循环的 Alamofire 同步请求