AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77495970
Accepted
Swift
Swift
Asked: 2023-11-16 23:13:16 +0800 CST2023-11-16 23:13:16 +0800 CST 2023-11-16 23:13:16 +0800 CST

A resposta da chamada de serviço padrão MVVM não chega no Viewcontroller rapidamente

  • 772

Estou usando o padrão MVVM para fazer chamadas de serviço

código: no viewcontroller postGenericCallVMa chamada e a resposta também estão chegando, mas print("testing viewmodel data in viewcontroller \(String(describing: postVM.postDataVM?.postCount))")nula, por quê?

onde estou errado?

struct RequestObject {
var params: [String: Any]? = nil
var method: HTTPMethod
var urlPath: String
var isTokenNeeded: Bool
var isLoaderNeed: Bool = false
var isErrorNeed: Bool = false
var vc: UIViewController?
}

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

fileprivate override init() {
    super.init()
}

func serviceCall<T: Decodable>(requestObject: RequestObject, completion: @escaping (Result<APIResponse<T>, Error>) -> Void) {
    
    guard let url = URL(string: requestObject.urlPath) else {
        return
    }
    
    var urlRequest = URLRequest(url: url)
    
    if requestObject.isTokenNeeded {
        let token = "Bearer token" // Replace with your actual token
        urlRequest.setValue(token, forHTTPHeaderField: "Authorization")
    }
    
    urlRequest.httpMethod = requestObject.method.rawValue
    
    if let params = requestObject.params {
        let paramsReq: [String: Any] = ["jsonrpc": "2.0", "params": params]
        do {
            urlRequest.httpBody = try JSONSerialization.data(withJSONObject: paramsReq)
        } catch {
            completion(.failure(error))
            return
        }
    }
    
    let task = URLSession.shared.dataTask(with: urlRequest) { data, _, error in
        
        if let data, let string = String(data: data, encoding: .utf8) {
            print("debug check \(string)")
        }
        do {
            
            let response = try JSONDecoder().decode(APIResponse<T>.self, from: data!)
            
            DispatchQueue.main.async {
                completion(.success(response))
            }
        } catch {
            DispatchQueue.main.async {
                completion(.failure(error))
            }
        }
    }
    task.resume()
}
}

e este é o meu código VIewmodel aqui print o/p result view model: model data coming

class PostViewModel {

var postDataVM: PostGenResult?

func postGenericCallVM(){
    
    let param = ["page_no" : "1"] as? [String:Any]
    
    let requestObject = RequestObject(
        params: param,
        method: .post,
        urlPath: "https://hsfjkhskdn",
        isTokenNeeded: true,
        isLoaderNeed: true,
        isErrorNeed: true
    )
    APINetworkManager2.sharedInstance.serviceCall(requestObject: requestObject) { (result: Result<APIResponse<PostGenResult>, Error>) in
        switch result {
        case .success(let response):
            self.postDataVM = response.result as? PostGenResult
            print("result view model: \(self.postDataVM)")
            
        case .failure(let error):
            print("Error decoding JSON: \(error)")
        }
    }
}
}

o/p: obtendo resposta com sucesso no viewcontroller

modelo de visualização de resultado: Opcional (PracticeCode.PostGenResult (pageCount: 1, perPage: 10, postCount: 5, userReminder: [PracticeCode.UserReminder (id: 17, receiverID: 7, type: "Assinatura", mensagem: "Sua assinatura está vencida em 2

e este é o meu código do viewcontroller: aqui

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    
    postVM.postGenericCallVM()
    
    print("testing viewmodel data in viewcontroller \(postVM.postDataVM?.postCount)")
    
}
}

a chamada de serviço está ligando e a resposta está chegando, mas testing viewmodel data in viewcontrollernão dá nada

testando dados do viewmodel no viewcontroller: nil

json
  • 1 1 respostas
  • 32 Views

1 respostas

  • Voted
  1. Best Answer
    son
    2023-11-16T23:24:32+08:002023-11-16T23:24:32+08:00

    É verdade, porque você está solicitando uma asynctarefa e postVM.postGenericCallVM()levará algum tempo para retornar a chamada.

    //Will execute on background thread
    APINetworkManager2.sharedInstance.serviceCall
    

    Por outro lado, esses códigos serão executados em sincronia. Para mais detalhes, você pode colocar um log aqui.

    print("Requesting")
    postVM.postGenericCallVM()
    print("testing viewmodel data in viewcontroller \(postVM.postDataVM?.postCount)")
    

    Então você verá que a ordem de impressão deve ser:

    Requesting
    
    testing viewmodel data in viewcontroller \(postVM.postDataVM?.postCount)
    
    result view model: \(self.postDataVM)
    

    Como lidar? Abordagem 1, adicione a conclusão @escaping na postGenericCallVMfunção.

    func postGenericCallVM(completion: @escaping (() -> Void)) {
        ...
        switch result {
            ...
        }
        completion()
    }
    
    postVM.postGenericCallVM { [weak self] in
        //TODO: Re-check postVM.postDataVM here
    }
    

    Abordagem 2, useasync await

    func postGenericCallVM() async {
        await withCheckedContinuation { continuetion in
        ...
            APINetworkManager2.sharedInstance.serviceCall {
                ...
                continuetion.resume(returning: ())
            }
        }
    }
    
    Task {
        await postVM.postGenericCallVM()
        print("\(postVM.postDataVM)")
    }
    
    • 1

relate perguntas

  • PostgreSQL: como validar campos JSON?

  • filtragem jq em chave específica e agrupamento de valores em uma única célula csv

  • Elasticsearch: Erro ao criar réplicas em cluster de 2 nós

  • Mensagem de erro do Apex de vendas em uma linha em que nada foi alterado

  • Como usar a função de tecla XSLT 3.0

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve