Alamofire回调永远不会回来

时间:2018-04-12 22:46:49

标签: ios swift http networking

我正在使用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();
    }
}
}

1 个答案:

答案 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()