我在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
时,它就像我之前说过的那样有效。
我认为问题在于线程,但我不能说清楚。
答案 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中称为闭包,或在其他语言上称为回调)。事件的顺序是:
getAllDataFromURL()
printTheJsonDatas()
Alamofire.request()
self.tryingSomething.appendContentsOf(...)
如果您希望打印功能正常工作,您需要在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)
}