Xamarin IOS TableView不会在While循环中更新

时间:2016-08-17 17:59:45

标签: uitableview xamarin.ios

如果我想在TableView中添加一个项目,则必须停止循环。但我有一个WebResponse,并且每个HTTP Chunked都需要一个新项目。

是否有人有解决方案将项目添加到TableView而不停止while循环?

这是我的主题

    new System.Threading.Thread(new System.Threading.ThreadStart(() =>
    {
        InvokeOnMainThread(() =>
        {
            HttpRequest t = new HttpRequest(TableView, source);
            t.Start();
        });
    })).Start();

这是我的循环:

WebResponse webResponse = web.GetResponse();
        Stream stream = webResponse.GetResponseStream();

        var reader = new XmlTextReader(stream);
        string telegram = "";
        int check = 0;
        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    break;
                case XmlNodeType.Text:
                    break;
                case XmlNodeType.EndElement:
                    break;
            }
        }

并在循环中的一个功能我这样做

        (tableView.Source as TelegrammSource).AddTelegramm(details);
        tableView.ReloadData();

2 个答案:

答案 0 :(得分:0)

有一个示例来完成异步数据请求并刷新您的tableview:

string strURL = "https://api.bitcoinaverage.com/ticker/";
    MyHTTPRequestManager.Instance.GetDataFromUrl (strURL,(string dataStr)=>{
        Console.WriteLine("Getting data succeed");
        Console.WriteLine("The dataStr = "+dataStr);
        //update your dataList here
        InvokeOnMainThread(delegate {
            //Update your tableView or collectionView here, all UI stuff must be invoke on Main thread
        });
    });

这是MyHTTPRequestManager.cs:

public class MyHTTPRequestManager
{
public delegate void GettingDataCallback(string dataStr);

private static MyHTTPRequestManager instance = null;
public static MyHTTPRequestManager Instance{
    get{
        if(null == instance)
            instance = new MyHTTPRequestManager();
        return instance;
    }
}

public void GetDataFromUrl(string strURL,GettingDataCallback callback)
{
    Console.WriteLine ("Begin request data.");
    System.Net.HttpWebRequest request;
    request = (System.Net.HttpWebRequest)WebRequest.Create(strURL);
    System.Net.HttpWebResponse response;
    response = (System.Net.HttpWebResponse)request.GetResponse();
    System.IO.StreamReader myreader = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8);
    string responseText = myreader.ReadToEnd();
    myreader.Close();
    Console.WriteLine ("Getting succeed, invoke callback.");
    callback.Invoke (responseText);
}
}

希望它可以帮到你。

答案 1 :(得分:0)

这是我在TableviewController上的ViewDidLoad

base.ViewDidLoad();
        Console.Out.WriteLine("ViewDidLoad");
        TableView.SeparatorColor = UIColor.Black;
        TableView.SeparatorStyle = UITableViewCellSeparatorStyle.SingleLine;
        source = new TelegrammSource();
        TableView.Source = source;
        new System.Threading.Thread(new System.Threading.ThreadStart(() =>
        {
            InvokeOnMainThread(() =>
            {
                HttpRequest t = new HttpRequest(TableView, source);
                t.Start();
            });
        })).Start();

这是我的HttpRequest

public class HttpRequest
{
    //private volatile bool _shouldStop;
    public string url = "";
    private HttpWebRequest web = null;
    readonly UITableView tableView;

    public HttpRequest(UITableView tableView, TelegrammSource source)
    {
        this.tableView = tableView;


        url = "http://www.example.com";
        web = (HttpWebRequest)WebRequest.Create(url);
        web.Credentials = new NetworkCredential((kanalsettings[(NSString)GlobaleVariablen.KE_BENUTZERNAME] as NSString), (kanalsettings[(NSString)GlobaleVariablen.KE_PASSWORT] as NSString));
    }

    public void Start()
    {
        WebResponse webResponse = web.GetResponse();
        Stream stream = webResponse.GetResponseStream();

        var reader = new XmlTextReader(stream);
        string telegram = "";
        int check = 0;
        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    break;
                case XmlNodeType.Text:
                    break;
                case XmlNodeType.EndElement:
                        Process(telegram);
                    break;
            }
        }
    }

    public void Process(string result)
    {
        var details = new TelegrammDetails();
        var xml = new XmlDocument();
        xml.LoadXml(result);
        XmlNodeList telegram = xml.SelectNodes("/");
        foreach (XmlNode item in telegram)
        {

        }
        (tableView.Source as TelegrammSource).AddTelegramm(details);
        tableView.ReloadData();

    }

}
相关问题