Асинхронная проблема: вызов Web Api из Swift - PullRequest
0 голосов
/ 30 мая 2018

Когда я нажимаю кнопку в первый раз, я получаю сообщение "Ошибка 998".И тогда я получаю "успех 999", когда я нажимаю второй раз.Это должна быть асинхронная проблема, поэтому я добавил строку кода DispatchQueue, но она не сработала.Я должен получить «успех 999», когда я нажму кнопку в первый раз.Как я могу решить эту проблему?(Кстати, swift версия 4.1)

Вот исходный код:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var lblDetail: UILabel!

var globalTempValue = ""

override func viewDidLoad() {
    super.viewDidLoad()
}


struct MyGitHub: Codable {
    let resultCode: String?
    private enum CodingKeys: String, CodingKey {
        case resultCode
    }
}

@IBAction func btnClickAction(_ sender: Any) {
  callMyApi()

    if (globalTempValue == "999")
    {
       print ("success 999")
    }
    else
    {
        print ("fail 998")
    }
}

func callMyApi()
{
    guard let gitUrl = URL(string: "https://transsupp.com/tApp/ws01.ashx") else
    { return }
    URLSession.shared.dataTask(with: gitUrl)
    {
            (data, response , error) in
            guard let data = data else { return }
            do
            {
                let decoder = JSONDecoder()
                let gitData = try decoder.decode(MyGitHub.self, from: data)
                DispatchQueue.main.async
                    {
                        self.globalTempValue = gitData.resultCode!
                    }
            }
            catch
                let err
            {
                print("Err", err)
            }
    }.resume()
}
}

web api возвращает эту структуру:

{
  "resultCode": "999",
  "resultMessage": "ok",
  "showPopUpPage": "True",
  "contentTextOfPopUpPage": "ws01Settings4Colors.ashx<br/>table:renkAyarlari<br/>showPopUpPage:True<br/><a href=https://www.google.com>click for the link brother</a>and this a skip line in here<br/>",
  "backgroundColor": "4D5656",
  "textColorOnThePage": "FFFFFF",
  "alertTextColorOnThePage": "E91E63",
  "buttonTextColor": "FFFFFF",
  "buttonBackgroundColor": "81D4FA",
  "alertButtonTextColor": "FFFFFF",
  "alertButtonBackgroundColor": "E91E63",
  "inputTextColor": "4D5656",
  "inputBackgroundColor": "FFFFFF",
  "dropDownMenuTextColor": "4D5656",
  "dropDownMenuBackgroundColor": "FFFFFF",
  "showBackgroundImage": "False",
  "backgroundImagePath": "http://transsupp.com/app/Assets/BackgroundImages/other_background.png"
}

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Используйте блок завершения для выполнения действия после асинхронной задачи.

func callMyApi(param: String, completion: @escaping (_ result : MyGitHub?, _ error: Error?) -> Void)
    {
        guard let gitUrl = URL(string: "https://transsupp.com/tApp/ws01.ashx") else
        { return }
        URLSession.shared.dataTask(with: gitUrl)
        {
            (data, response , error) in
            guard let data = data else { return }
            do
            {
                let decoder = JSONDecoder()
                let gitData = try decoder.decode(MyGitHub.self, from: data)
                DispatchQueue.main.async
                    {
                        completion(gitData, nil)
                }
            }
            catch
                let err
            {
                print("Err", err)
                completion(nil, err)
            }
            }.resume()
    }

Вызовите вышеуказанную функцию:

self.callMyApi(param: "PRARAM_STRING") { (result, error) in
        if result?.resultCode == "999"
        {
            print ("success 999")
        }else{
            print ("fail 998")
        }
    }
0 голосов
/ 30 мая 2018

Вы вызываете свой API, затем, не дожидаясь ответа, проверяете globalTempValue, который в этот момент равен "".Во второй раз вы добились успеха, потому что к тому времени результат вернулся с вашего первого звонка.Вы исправляете это несколькими способами, один из них находится внутри замыкания dataTask, другой - с помощью наблюдателя свойства в globalTempValue, например:

var globalTempValue: String = "" {
    willSet{
        if (newValue == "999")
        {
            print ("success 999")
        }
        else
        {
            print ("fail 998")
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...