ios - 为什么即使我使用 Alamofire 发出请求,我的应用程序仍然卡住?

标签 ios swift alamofire

我是编程新手,但通常我可以毫无问题地发出请求从服务器获取 JSON 数据。

我在这里尝试了一些类似的线程:Alamofire network calls not being run in background thread 但该解决方案并没有解决我的问题!

所以我想实现分页,所以当用户到达屏幕底部时,我将向服务器发出请求。

但不幸的是,即使我可以从服务器获取 JSON 数据,但它会卡住应用程序。看来这不是在后台执行的(仍在主线程上)。

但我不明白为什么。我假设如果我使用 Alamofire 发出请求,它会自动异步执行。因为通常我会在 viewDidLoadviewWillAppear 上发出请求,并且我的应用程序永远不会卡住。

这是 ScrollView 到达底部时触发的代码:

extension HomeVC : UIScrollViewDelegate {

    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {


        let currentOffset = scrollView.contentOffset.y
        let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height


            if maximumOffset - currentOffset <= 10.0 {

            // load more product data when reaching the bottom of main scroll view

            pageNumberTracker += 1
            SVProgressHUD.show(withStatus: "Please Wait")

            Product.getProducts(searchType: "newest", pageNumber: pageNumberTracker, categoryID: selectedCategoryID) { (errorWhileMakingRequest, errorMessageFromServer, products) in

                if errorWhileMakingRequest != nil || errorMessageFromServer != nil {
                    SVProgressHUD.dismiss()
                    return
                }



                guard let products = products else {self.activityIndicator.stopAnimating(); return}

                self.thirdProducts += products
                self.updateLocalDataToBeTheSameAsRealmDatabase()
                self.setThirdListProductCollectionViewHeight()
                self.thirdListProductCollectionView.reloadData()
                SVProgressHUD.dismiss()


            }




        }
    }



}

这是getProduct()方法:

static func getProducts(searchType: String, pageNumber: Int = 0, categoryID: Int = 0, completion: @escaping(_ errorWhileMakingRequest: Error?, _ errorMessageFromServer: String?,_ productsData: [Product]?) -> Void) {

        let urlProducts = URLService.products.endPoint
        let headers = ["Content-Type": "application/x-www-form-urlencoded"]

        let parameters : [String:Any] = [
            "type": searchType,
            "language_id": 1,
            "page_number": pageNumber,
            "minPrice": 0,
            "maxPrice":10000000,
            "categories_id": categoryID
        ]

        AlamofireManager.shared.request(urlProducts,
                          method: .post,
                          parameters: parameters,
                          encoding: URLEncoding.default,
                          headers:headers)
            .validate()
            .responseJSON { response in

                switch response.result {

                case .failure(let error) :

                    completion(error,nil,nil)

                case .success(let value) :

                    let json = JSON(value)
                    let successStatus = json["success"].stringValue

                    if successStatus == "0" {
                        let errorMessage = json["message"].stringValue
                        completion(nil,errorMessage,nil)
                    } else if successStatus == "1" {

                        let productsArrayJSON = json["product_data"].arrayValue
                        var productsData = [Product]()

                        for productJSON in productsArrayJSON {
                            if let productDictionary = productJSON.dictionaryObject {
                                let product = Product(dictionary: productDictionary)
                                productsData.append(product)
                            } else {
                                completion(nil,nil,nil)
                                break
                            }
                        }

                        completion(nil,nil,productsData)



                    }

                }

        }




    }

这是 Alamofire 管理器代码:

struct AlamofireManager {
    static let shared: SessionManager = {
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 15
        let sessionManager = Alamofire.SessionManager(configuration: configuration, delegate: SessionDelegate(), serverTrustPolicyManager: nil)
        return sessionManager
    }()
}

这里出了什么问题?

最佳答案

默认情况下,Alamofire 请求的完成将在主线程上执行。如果服务器的响应非常大,那么执行这些 JSON 操作可能会非常昂贵并导致一些帧丢失。 Alamofire 允许您通过如下调用来设置完成队列:

AlamofireManager.shared.request(urlProducts,
                          method: .post,
                          parameters: parameters,
                          encoding: URLEncoding.default,
                          headers:headers)
            .validate()
            .responseJSON(queue: DispatchQueue.someQueue) { response in
                 ...
            }

关于ios - 为什么即使我使用 Alamofire 发出请求,我的应用程序仍然卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55662923/

相关文章:

ios - 如何在 iOS 8 Swift 中为形状添加阴影?

ios - Alamofire .POST 编码 (.URL)

ios - 在 Swift 中使用 Alamofire 处理 XML 数据

ios - 如何在 Swift 中使用 Alamofire 上传带有 JSON 参数的图像?

iphone - 如何使用具有一定随机性的 CAReplicatorLayer 创建 Spark 效果?

ios - 将 UIBarButtonSystemItemAdd 推送到不同的 View Controller

iOS Multipeer Connectivity - 在自定义 MCNearbyServiceBrowser 中显示 DiscoveryInfo

ios - 原生 ios 和 android 中 signalR 的客户端

swift - 如何从 Swift 中的字符串中删除变音符号?

ios - Swift:为 CustomTab 重用一个 ViewController