【发布时间】:2018-01-29 16:19:12
【问题描述】:
我想从另一个班级更新我的进度视图,但不知道如何正确执行。
在我的 ViewController 中,我有一个启动任务的按钮,该按钮从硬编码链接下载文件
public void downloadTask()
{
NSUrl url = NSUrl.FromString("https://www.dropbox.com/s/5fsciuo0nprzvu6/TestDoc.docx?dl=0");
var config = NSUrlSessionConfiguration.DefaultSessionConfiguration;
NSUrlSession session = NSUrlSession.FromConfiguration(config, (new SimpleSessionDelegate() as INSUrlSessionDelegate), new NSOperationQueue());
var downloadTask = session.CreateDownloadTask(NSUrlRequest.FromUrl(url));
downloadTask.Resume();
}
在我的 SimpleSessionDelegate 类中,我想在 DidWriteData 方法中更新我的进度视图。
public class SimpleSessionDelegate : NSUrlSessionDownloadDelegate
{
public override void DidFinishDownloading(NSUrlSession session, NSUrlSessionDownloadTask downloadTask, NSUrl location)
{
var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var destinationPath = Path.Combine(documents, "Sample.docx");
if (File.Exists(location.Path))
{
NSFileManager fileManager = NSFileManager.DefaultManager;
NSError error;
fileManager.Remove(destinationPath, out error);
bool success = fileManager.Copy(location.Path, destinationPath, out error);
if (!success)
{
Console.WriteLine("Error during the copy: {0}", error.LocalizedDescription);
}
}
}
public override void DidWriteData(NSUrlSession session, NSUrlSessionDownloadTask downloadTask, long bytesWritten, long totalBytesWritten, long totalBytesExpectedToWrite)
{
new System.Threading.Thread(new System.Threading.ThreadStart(() =>
{
InvokeOnMainThread(() =>
{
//how to access UI?
});
})).Start();
}
}
【问题讨论】:
-
您最好在 ViewController 中设置一个计时器,每隔一秒左右向您的 SimpleSessionDelegate 询问文件下载的状态,并根据需要进行更新。
-
那么直接在 didWriteData 方法中更新进度视图是性能杀手吗?
-
主要原因是将 UI 代码排除在文件下载代码之外。更干净
-
@R.Kut 你好,你的问题解决了吗?
标签: ios xamarin background nsurlsession