2013-10-19 80 views
0

我一直在寻找所有看图像下载时如何更新progressview。我的当前下载的代码是UIProgressView跟踪状态下载ios monotouch

ThreadPool.QueueUserWorkItem(new WaitCallback(RetrieveImage),(object)cell); 

private void RetrieveImage(object val) 
{ 
CustomViewCell cell = (CustomViewCell)val; 
int i = 0; 
//lock(_imgDict){ 
//if (!_imgDict.ContainsKey(cell.imageUrl)) 
//{ 
    NSUrl nsUrl = new NSUrl(cell.imageUrl); 
    NSData data = NSData.FromUrl(nsUrl); 
    if (data != null) { 
InvokeOnMainThread (() => { 
    cell.imgImageView.Image = new UIImage (data); 
    i++; 
    cell.ProgressBar.Progress = (float)(i + 1)/3; 
    }); 
    //_imgDict.Add (cell.imageUrl, data); 
} 
} 

这一切确实是表现出与75%完成图像的顶部的进度条。没有真正显示正在更新的进度?如何在当前图像仍在下载时使用此当前线程更新进度栏。我看过其他例子,但没有真正能够遵循它们。

编辑:

ThreadPool.QueueUserWorkItem(new WaitCallback(RetrieveImage),(object)cell); 

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 
using(var client = new WebClient()) 
{ 
client.DownloadProgressChanged+= 
delegate(object sender, DownloadProgressChangedEventArgs e) 
    { 
     if (e.TotalBytesToReceive != 0) { 
     InvokeOnMainThread (() => { 
     cell.PG.Progress = e.BytesReceived/
       e.TotalBytesToReceive; 
       }); 
      } 
    }; 
client.DownloadDataCompleted += 
delegate(object sender, DownloadDataCompletedEventArgs e) 
    { 
     if(e.Result!=null) 
      { 
       NSData data = NSData.FromArray(e.Result); 
      _imgDict.Add (cell.ImageUrl, data); 
     InvokeOnMainThread (() => { 
        cell.PG.Hidden=true; 
        cell.imgImageView.Image = UIImage.LoadFromData(data); 
      }); 
    } 
    else 
    { 
     InvokeOnMainThread (() => { 
     cell.PG.Hidden=true; 
        cell.imgImageView.Image = UIImage.FromBundle("Images/retrydownload.png"); 
        }); 
    } 
}; 
    client.DownloadDataAsync(new Uri(cell.ImageUrl)); 
} 

现在有了这个更新的代码我没有看到进度条,同时下载

回答

1

你硬编码进度75%。 在你的代码i == 0,所以(float)(i + 1)/3 = 1/3 = 0.75

NSData.FromUrl()不支持进度处理的简单方法。如果你想坚持原生的东西,你必须继承NSUrlConnection,并覆盖DidReceiveData()

另外,我建议你使用Web客户端来代替,这是下载东西的.NET方式:

var client = new WebClient(); 
client.DownloadProgressChanged += (args) => 
{ 
Console.WriteLine("Downloaded {0} of {1} bytes", args.BytesReceived, args.TotalBytesToReceive); 
}; 

client.DownloadFileCompleted += (args) => Console.WriteLine("Download finished."); 
client.DownloadFileAsync(new Uri("someurl"), "somelocalpath"); 
+0

我会避免WebClient的,因为它执行的UI线程大部分工作,而坚持这一:https://github.com/paulcbetts/ModernHttpClient –

+0

那么我喜欢我的方式通过ios方式.Net方式的原因是,如果URL无效,NSData = null;我对UI做了一些不同的事情,.net对于webclient不起作用。我将如何去将NSLUrlConnection合并到我的代码中,你能否提供一些方向 – Jake

+0

另外,如何在文件完成时隐藏进度条,因为将Frame更改为(0,0,0,0)并不完全它 – Jake