2016-08-17 13 views
1

TableViewにアイテムを追加する場合は、ループを停止する必要があります。しかし、私はWebResponseを持っていて、すべてのHTTP Chunkedによって、TableViewには新しい項目が必要です。Xamarin IOS TableViewがWhileループで更新されない

whileループを停止せずにTableViewにアイテムを追加するソリューションはありますか?

これは私のスレッド

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(); 
+0

ですが停止しなければならない、あなたはより多くを説明することができます。 –

+0

あなたのコードを教えてください。ループがバックグラウンドスレッドで実行されていて、メインスレッドからUIを更新する必要がある場合は、ほとんどの場合そうです。 – Jason

+0

私は自分の質問を編集しています。 – Doxoh

答えて

0

あり終了するサンプルを行うループで目的球で非同期データをリクエストしてテーブルビューを更新する:

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); 
} 
} 

は、それはあなたを助けることができると思います。

+0

あなたの答えに感謝します。はい、それは助けることができますが、私はReadToEnd()関数を使用しません。私はHTTP Chunkesで作業しています。これが毎回接続が開かれる理由です。 – Doxoh

+0

明日私は家にいて、あなたにフィードバックを与えようとします – Doxoh

+0

だから私はそれを試しましたが、それはうまくいきません... – Doxoh

0

あなたがループによって何を意味しています。これは、TableviewController

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(); 

の私のviewDidLoadであり、これが私の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(); 

    } 

} 
関連する問題