Json值附加数组,但ViewDidLoad看起来是空的

时间:2016-08-19 15:37:26

标签: ios json swift

我在iOS工作,当我使用JSON数据时,我在函数中没有错误地打印它并附加一个String数组(我做得正确)

但是如果我想稍后到达String数组,json函数看起来似乎是空数组。为了测试,我在一个Button Action中打印了数组,然后它对我有用,但是当Json Function结束时我想在其他函数的String Datas中使用。

代码:

func getAllDataFromURL()
{
    var i : Int = 0;
    var urlDatas : [String] = allJsonDatas.getAllTours();
    for(i = 0 ; i < allJsonDatas.getAllTours().count ; i += 1)
    {
        Alamofire.request(.GET, urlDatas[i]).responseJSON
        {(response) -> Void in

            if let arrivedData = response.result.value
            {
                print("********")
                print(arrivedData["generalTourDistrict"] as! String);
                print(arrivedData["otherTourDistrict"] as! String);
                print(arrivedData["photoURLS"] as! [String]);
                print(arrivedData["subTourDistrict"] as! String);
                print(arrivedData["tourCalendar"] as! String);
                print(arrivedData["tourDistrict"] as! String);
                print(arrivedData["tourName"] as! String);
                self.tryingSomething.appendContentsOf(arrivedData["photoURLS"] as! [String]);
                print("********\n")

            }
        }
    }
}

viewDidLoad是

override func viewDidLoad() {
    super.viewDidLoad()
  Alamofire.Request.addAcceptableImageContentTypes(acceptableContentTypes);


    self.getAllDataFromURL();
    self.printTheJsonDatas();

}

例如,在getAllDataFromURL()函数中,我可以正确打印它。

这是来自json:

的url数据的结果
["https://acenta.dominant.com.tr//dominant/webout/R12/php/product/img.php?path=L2QvMS9jcmkvc295a3VsL3VydW4vMDAvMjIvMTIvaW1hZ2UvL3VfMDAyMjEyLjAwMDAxLmpwZWc=&rx=650&ry=400", "https://acenta.dominant.com.tr//dominant/webout/R12/php/product/img.php?path=L2QvMS9jcmkvc295a3VsL3VydW4vMDAvMjIvMTIvaW1hZ2UvL3VfMDAyMjEyLjAwMDA2LmpwZWc=&rx=650&ry=400"]

printTheJsonDatas()打印一个空数组,如 - &gt; []

func printTheJsonDatas()
{
  print(tryingSomething)
  //tryingSomething : [String] 
}

令人惊讶的是,当我将printTheJsonDatas()放入buttonClickedAction时,它就像我之前说过的那样有效。

我认为问题在于线程,但我不能说清楚。

2 个答案:

答案 0 :(得分:1)

您正在连续调用Web服务请求和打印功能,因为它们是同步的,但它们不同步。当您使用Alamofire发出Web服务请求时,它的工作异常。所以你不能指望它在未来的某个时间内完成。您应该做的是在.response请求的Alamofire块中调用您的打印功能:

func getAllDataFromURL()
{
    var i : Int = 0;
    var urlDatas : [String] = allJsonDatas.getAllTours();
    for(i = 0 ; i < allJsonDatas.getAllTours().count ; i += 1)
    {
        Alamofire.request(.GET, urlDatas[i]).responseJSON
        {(response) -> Void in

            if let arrivedData = response.result.value
            {
                self.tryingSomething.appendContentsOf(arrivedData["photoURLS"] as! [String]);
                self.printTheJsonDatas();
            }
        }
    }
}

您的代码的另一个问题是它正在进行多个Web服务调用。即使您在.response块中调用打印功能,它也可能无法正常工作。它会以不同的尺寸打印多次。

答案 1 :(得分:0)

getAllDataFromURL()与完成块异步运行(在swift中称为闭包,或在其他语言上称为回调)。事件的顺序是:

  1. getAllDataFromURL()
  2. printTheJsonDatas()
  3. Alamofire.request()
  4. (等待AF回复)
  5. self.tryingSomething.appendContentsOf(...)
  6. 如果您希望打印功能正常工作,您需要在AF请求的完成块内调用它,例如:

    func getAllDataFromURL()
    {
        var i : Int = 0;
        var urlDatas : [String] = allJsonDatas.getAllTours();
        for(i = 0 ; i < allJsonDatas.getAllTours().count ; i += 1)
        {
            Alamofire.request(.GET, urlDatas[i]).responseJSON
            {(response) -> Void in
    
                if let arrivedData = response.result.value
                {
                    self.tryingSomething.appendContentsOf(arrivedData["photoURLS"] as! [String]);
                    //
                    self.printTheJsonDatas();
                    // ^
                }
            }
        }
    }
    

    你也可以用一个闭包来重写getAllDataFromURL()是异步的(更合适的方式来写这个,我会说):

    func getAllDataFromURL(completion: (result: Array) -> Void) {
        ...
        var returnArray = []
        // ^ here this is a local variable, doesn't need to be global anymore
        returnArray.appendContentsOf(arrivedData["photoURLS"] as! [String]);
        completion(returnArray)
    }