Json 响应在 swift 中加载速度非常慢

问题描述 投票:0回答:1

我有全速互联网,邮递员数据加载速度很快,但我的代码响应在 5 分钟后才出现,为什么?我哪里错了?我尝试了所有可能的方法来快速显示数据仍然面临问题。请在这里指导我

代码: 此代码响应将在 5 分钟后显示。最初我以为没有数据,但 5 分钟后显示数据。 我错在哪里?请指导我。

class APINetworkManagerMultipart: NSObject {
static let sharedInstance = APINetworkManagerMultipart()

fileprivate override init() {
    super.init()
}
func serviceCallWithMultipartFormData<T: Codable>(
    url: URL,
    headers: [String: String]?,
    parameters: [String: Any],
    completion: @escaping (Result<T, Error>) -> Void
) {
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    let token = "Bearer mytoken"
    request.setValue(token, forHTTPHeaderField: "Authorization")
    
    let boundary = "Boundary-\(UUID().uuidString)"
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    
    let body = NSMutableData()
    
    for (key, value) in parameters {
        if let stringValue = value as? String {
            body.append("--\(boundary)\r\n".data(using: .utf8)!)
            body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: .utf8)!)
            body.append("\(stringValue)\r\n".data(using: .utf8)!)
        }
        else if let data = value as? Data {
            
            body.append("--\(boundary)\r\n".data(using: .utf8)!)
            body.append("Content-Disposition: form-data; name=\"\(key)\"; filename=\"file\"\r\n".data(using: .utf8)!)
            body.append("Content-Type: application/octet-stream\r\n\r\n".data(using: .utf8)!)
            body.append(data)
            body.append("\r\n".data(using: .utf8)!)
        }
    }
    
    body.append("--\(boundary)--\r\n".data(using: .utf8)!)
    request.httpBody = body as Data
    
    if let customHeaders = headers {
        for (key, value) in customHeaders {
            request.setValue(value, forHTTPHeaderField: key)
        }
    }
    DispatchQueue.global(qos: .background).async {
        
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            if let error = error {
                completion(.failure(error))
                return
            }
            guard let data = data else {
                completion(.failure(error!))
                return
            }
            do {
                let decodedData = try JSONDecoder().decode(T.self, from: data)
                completion(.success(decodedData))
            } catch {
                completion(.failure(error))
            }
        }
        task.resume()
    }
}
} 

并在 VIewcontroller 中使用这样的服务调用:

func genericFormdataCall(){

let urlStr = URL(string: "https://prg-name/dev/api/student/edit-profile")!
let parameters: [String: Any] = [
    "dob": "2005-07-24",
    "name": "Student",
    "gender": "M",
    "school_location": "TestLocation",
    "school_name": "K V",
    "grade": "12th grade",
    "student_bio": "I am a student",
    "profile_pic": nil
] as! [String : Any]

DispatchQueue.global().async {
    
    APINetworkManagerMultipart.sharedInstance.serviceCallWithMultipartFormData(url: urlStr, headers: nil, parameters: parameters) { (result: Result<MultipartModel, Error>) in
        switch result {
        case .success(let response):
            // Handle the successful response
            self.formdataResponse = response
            print("Response: \(response)")
        case .failure(let error):
            // Handle the error
            print("Error: \(error)")
        }
    }
}
}
json swift web-services generics response
1个回答
0
投票

我已经尝试过你的最小代码。看来问题是 在

Result
上。我认为不能这样推断。我尝试添加一个名为
response
的参数。然后它就按预期工作了。

func serviceCallWithMultipartFormData<T: Codable>(
        url: URL,
        headers: [String: String]?,
        parameters: [String: Any],
        response: T.Type,
        completion: @escaping (Result<T, Error>) -> Void
) {
    ...
}

请注意,您应该删除这个不必要的代码

Dispatqueue.global
dataTask
函数已经异步运行。如果将数据绑定到某些视图,您只需要在主线程上处理完成即可。

© www.soinside.com 2019 - 2024. All rights reserved.