我正在使用Alamofire库向stackexchange api发出GET请求,我想将我从JSON中获得的结果保存在一个数组中,问题是alamofire任务是异步的,我需要它提供的数据来完成我的工作,如表格单元格插入等...我试图使用信号量让我的程序等待调用,但调用永远不会到达signal()。为什么会发生这种情况?是异步调用终止后继续工作的另一种方法吗?我对这些东西很新,所以我不太了解,任何帮助都表示赞赏。代码如下:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
public class Demo2 {
private static Connection con;
private static String query;
private static PreparedStatement PStat,PStat2;
private static ResultSet res,res2;
private static String Bill_Date;
public static void main(String args[])
{
try
{
con=Database.Database();
query="select Bill_Date from DailySales where Bill_Date='Apr 5, 2018'";
PStat=con.prepareStatement(query);
res=PStat.executeQuery();
while(res.next())
{
Bill_Date=res.getString("Bill_Date");
}
SimpleDateFormat month=new SimpleDateFormat("MMMM,yyyy",Locale.ENGLISH);
SimpleDateFormat dateformat=new SimpleDateFormat("MMM-dd,YYYY");
Date date=dateformat.parse(Bill_Date);
String MONTH=month.format(date);
System.out.println(MONTH);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
答案 0 :(得分:2)
首先,摆脱DispatchSemaphore。您使用它的方式将阻止主线程。非常糟糕的主意。
可能就像从闭包中调用tableView.reloadData()
一样简单。我还建议将数据加载到一个单独的函数中,以防某些时候你想从源代码刷新数据。
var users:[UserInfo] = []
var number:Int = 0
override func viewDidLoad() {
tableView.delegate = self
tableView.dataSource = self
loadData()
super.viewDidLoad()
}
func loadData() {
// GET the data from the stackexchange api
let param: Parameters = [
"order": "desc",
"max" : 10,
"sort" : "reputation",
"site" : "stackoverflow"
]
Alamofire.request("https://api.stackexchange.com/2.2/users", method: .get, parameters: param).responseJSON { (response) -> (Void) in
if let json = response.result.value {
// we got a result
/* I know this is a bit ugly */
let json1 = json as! [String:AnyObject]
let usersInfoFromJSON = json1["items"] as! NSArray // remember to cast it as NSDictionary
for userInfo in usersInfoFromJSON {
self.number = 70 // just for test
let userDict = userInfo as! NSDictionary
self.users.append(UserInfo(newName: userDict["display_name"] as! String,
newImageURL: userDict["profile_image"] as! String))
}
}
self.tableView.reloadData()
print(self.number) // just for test
}
}
如果你想变得聪明,你甚至可以将reloadData()移动到didSet
的{{1}}闭包中。当然,如果你这样做,请从Alamofire关闭中删除users
来电。
reloadData()