gpt4 book ai didi

ios - progrssView中的动画

转载 作者:行者123 更新时间:2023-12-01 20:07:00 25 4
gpt4 key购买 nike

我使用此代码下载文件。在最后时刻进行的 progrssView 中下载动画。而不是在整个过程中实现。如何解决问题?

我的 Xcode 项目中的代码:

- (void)viewDidLoad
{
_progressView = [[UIProgressView alloc] initWithProgressViewStyle: UIProgressViewStyleDefault];
_progressView.progressTintColor = [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:0.4];
[[_progressView layer]setFrame:CGRectMake(60, 150, 100, 25)];
[[_progressView layer]setBorderColor:[UIColor whiteColor].CGColor];
_progressView.trackTintColor = [UIColor clearColor];
[_progressView setProgress:(float)(50/100) animated:YES];

[[_progressView layer]setCornerRadius:_progressView.frame.size.width / 8];
[[_progressView layer]setBorderWidth:1];
[[_progressView layer]setMasksToBounds:TRUE];
_progressView.clipsToBounds = YES;
[self.view addSubview:_progressView];

_session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

[self.progressView setProgress:0 animated:NO];
}

-(IBAction) downloadButton:(id)sender
{
if(_downloadTask == nil){
_url =[NSURL URLWithString:@"http://www.freeiconspng.com/uploads/ios-png-6.png"];
_url1 =[NSURL URLWithString:@"http://www.freeiconspng.com/uploads/ios-png-6.png"];
_downloadTask = [_session downloadTaskWithURL:_url];
_downloadTask = [_session downloadTaskWithURL:_url1];
[_downloadTask resume];

}
else
[_downloadTask resume];
}
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"image1.png"];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:NO];

NSData *urlData = [NSData dataWithContentsOfURL:_url];
[urlData writeToFile:filePath atomically:YES];

NSString *filePath1 = [documentsDirectory stringByAppendingPathComponent:@"image2.png"];
BOOL fileExists1 = [[NSFileManager defaultManager] fileExistsAtPath:filePath1 isDirectory:NO];

NSData *urlData1 = [NSData dataWithContentsOfURL:_url1];
[urlData1 writeToFile:filePath1 atomically:YES];
}


- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;{
dispatch_async(dispatch_get_main_queue(), ^{
[self.progressView setProgress:totalBytesWritten/totalBytesExpectedToWrite animated:YES];
});
}

更新

你是这个意思吗?
dispatch_async(dispatch_get_main_queue(), ^{
_session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

});

它不起作用。

我添加标签
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten  totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;{
dispatch_async(dispatch_get_main_queue(), ^{
[self.progressView setProgress:totalBytesWritten/totalBytesExpectedToWrite animated:YES];
_label = [[UILabel alloc]initWithFrame:CGRectMake(91, 15, 500, 50)];
_label.text = [NSString stringWithFormat: @"%lld", totalBytesWritten];
_label.numberOfLines = 1;
_label.backgroundColor = [UIColor blackColor];
_label.textColor = [UIColor whiteColor];
_label.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:_label];


});

}

在下载时,标签中的数字会增加。增加数字停止后,我看到 progrssView动画片。

我的标签 https://drive.google.com/file/d/0B0EJbcHq3ZALX0JNLU1iTFA1d2M/view

最佳答案

您发布的代码看起来很合理。您已经实现了 URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:委托(delegate)方法,应该在数据进入文件时调用。您正在设置从调用到 dispatch_async(dispatch_get_main_queue()) 的进度 View ,您通常应该这样做。
我注意到的一件事是您使用 [NSOperationQueue mainQueue] 创建您的 NSURLSession 配置。 ,这将导致在主线程上运行的操作队列上调用您的 NSURLSession 委托(delegate)方法。
尝试为操作队列传入 nil。您已经通过将 UI 代码包装在对 dispatch_async(dispatch_get_main_queue()) 的调用中来保护您的 UI 代码。像你应该的那样,所以委托(delegate)方法应该不受后台串行队列的影响。
我还建议记录 totalBytesWritten 的值和 totalBytesExpectedToWrite在您的URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:方法来确定它被调用了多少次以及使用什么值。
编辑
您将在调用 dispatch_async 的内部显示创建 NSURLSession 的代码:

dispatch_async(dispatch_get_main_queue(), ^{
_session =
[NSURLSession sessionWithConfiguration:
[NSURLSessionConfiguration defaultSessionConfiguration]
delegate:self
delegateQueue:[NSOperationQueue mainQueue]];
});
这没有任何意义。我的意思是这样的:
_session = 
[NSURLSession sessionWithConfiguration:
[NSURLSessionConfiguration defaultSessionConfiguration]
delegate: self
delegateQueue: nil];
通过为 delegateQueue 参数传递 nil,您的委托(delegate)方法将从后台调用。
每次调用委托(delegate)方法时添加一个新标签也很疯狂。只需使用 NSLog:
- (void)URLSession:(NSURLSession *)session downloadTask:
(NSURLSessionDownloadTask *) downloadTask
didWriteData:(int64_t) bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;
{
NSLog(@"In didWriteData, totalBytesWritten = %l, filesize = %l",
totalBytesWritten,
totalBytesExpectedToWrite);
dispatch_async(dispatch_get_main_queue(), ^
{
[self.progressView setProgress:totalBytesWritten/totalBytesExpectedToWrite
animated:YES];
});
}

关于ios - progrssView中的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38529790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com