- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用于测试 AFNetworking
的应用程序API。它从服务器下载文档并将它们放置在应用程序的沙箱中。用户可以开始下载、暂停/恢复下载和取消下载。按预期启动、暂停和恢复所有工作。然而,取消做了一些我不期望的事情。
应用程序
表中的每个单元格代表一个“下载”,这是我的模型。表格 View Controller 监听单元格中的点击并将消息发送到 begin
/cancel
/pause
/resume
下载。我有课DownloadManager
跟踪我的下载模型对象。我有三等AFFileDownloadAPIClient
(使用 AFHTTPClient
作者推荐的 AFNetworking
模式)。 DownloadManager
在 AFFileDownloadAPIClient
上调用相应的消息进而调用 NSOperation
上的适当方法.
代码
下面的方法创建一个新的AFHTTPRequestOperation
,将位流式传输到文件(这工作正常),并将其放入队列中,该队列为我启动操作。需要注意的几点: 1) 我在 "Content-Disposition"
中放入了一些元数据。像内容长度和生成的文件名这样的标题,因为下载开始时都不知道。请记住,这些位正在流式传输给我。 2) AFFileDownloadAPIClient
保留一个带有整数索引键和 AFHTTPRequestOperation
的字典对于与 UITableView
中的索引对应的每个下载.我发现有必要稍后将操作检索到 pause
, resume
, 等等...
这是在 AFFileDownloadAPIClient
:
- (void)downloadFileWithIndex:(int)index fileName:(NSString *)fileName {
// Using standard request operation
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.inputStream = [NSInputStream inputStreamWithURL:request.URL];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:fileInDocumentsPath append:YES];
// BLOCK level variables //
__weak AFHTTPRequestOperation *weakOperation = operation; // For use in download progress BLOCK
__weak NSDate *startTime = [NSDate date];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSHTTPURLResponse *response = (NSHTTPURLResponse*)weakOperation.response;
NSString *contentDisposition = [[response allHeaderFields] objectForKey:@"Content-Disposition"];
NSArray *dispositionMetadata = [contentDisposition componentsSeparatedByString:@";"];
NSString *fileName = @"<?>";
// 3rd item is file name
if (dispositionMetadata != nil && dispositionMetadata.count == 4)
{
fileName = [dispositionMetadata objectAtIndex:2];
}
if ([_downloadFileRequestDelegate respondsToSelector:@selector(downloadFileRequestFinishedWithData:fileName:atIndex:startTime:)])
[_downloadFileRequestDelegate downloadFileRequestFinishedWithData:responseObject fileName:fileName atIndex:index startTime:startTime];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if ([_downloadFileRequestDelegate respondsToSelector:@selector(downloadFileRequestFailedWithError:atIndex:startTime:)])
[_downloadFileRequestDelegate downloadFileRequestFailedWithError:error atIndex:index startTime:startTime];
}
];
// Check "Content-Disposition" for content-length
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
NSHTTPURLResponse *response = (NSHTTPURLResponse*)weakOperation.response;
NSString *contentDisposition = [[response allHeaderFields] objectForKey:@"Content-Disposition"];
NSArray *dispositionMetadata = [contentDisposition componentsSeparatedByString:@";"];
// 4th item is length
if (dispositionMetadata != nil && dispositionMetadata.count == 4)
{
totalBytesExpectedToRead = [[dispositionMetadata objectAtIndex:3] doubleValue];
}
// Notify the delegate of the progress
if ([_requestProgressDelegate respondsToSelector:@selector(requestDidReceiveBytesForIndex:bytes:totalBytes:)])
[_requestProgressDelegate requestDidReceiveBytesForIndex:index bytes:bytesRead totalBytes:totalBytesExpectedToRead];
}];
// Check to see if operation is already in our dictionary
if ([[self.downloadOperations allKeys] containsObject:[NSNumber numberWithInt:index]] == YES)
[self.downloadOperations removeObjectForKey:[NSNumber numberWithInt:index]];
// Add operation to storage dictionary
[self.downloadOperations setObject:operation forKey:[NSNumber numberWithInt:index]];
// Queue up the download operation. No need to start the operation explicitly
[self enqueueHTTPRequestOperation:operation];
}
cancel
,
pause
,
resume
方法。请记住,暂停和恢复功能似乎工作得很好。
- (void)cancelDownloadForIndex:(int)index {
AFHTTPRequestOperation *operation = [self.downloadOperations objectForKey:[NSNumber numberWithInt:index]];
if (operation != nil) {
[operation cancel];
// Remove object from dictionary
[self.downloadOperations removeObjectForKey:[NSNumber numberWithInt:index]];
}
}
- (void)pauseDownloadForIndex:(int)index {
AFHTTPRequestOperation *operation = [self.downloadOperations objectForKey:[NSNumber numberWithInt:index]];
if (operation != nil)
[operation pause];
}
- (void)resumeDownloadForIndex:(int)index {
AFHTTPRequestOperation *operation = [self.downloadOperations objectForKey:[NSNumber numberWithInt:index]];
if (operation != nil)
[operation resume];
}
progressView
在
UITableViewCell
我必须至少做这两件事。
Download
的数据模型类. Download
对象及其状态。 - (void)downloadDidReceiveBytesForIndex:(int)downloadIndex bytes:(long long)bytes totalBytes:(double)totalBytes {
NSIndexPath *path = [NSIndexPath indexPathForRow:downloadIndex inSection:0];
DownloadTableViewCell *cell = (DownloadTableViewCell*)[self.tableView cellForRowAtIndexPath:path];
Download *download = [_downloadManager.downloads objectAtIndex:path.row];
download.bytesDownloaded += bytes;
download.percentageDownloaded = download.bytesDownloaded / totalBytes;
// as a factor of 0.0 to 1.0 not 100.
cell.downloadProgressView.progress = download.percentageDownloaded;
float MB_CONVERSION_FACTOR = 0.000000953674;
NSString *bytesText = [NSString stringWithFormat:@"Downloading %.2f of %.2f MB", roundf((download.bytesDownloaded * MB_CONVERSION_FACTOR)*100)/100.0, roundf((totalBytes * MB_CONVERSION_FACTOR)*100)/100.0];
cell.downloadProgressLabel.text = bytesText;
}
UITableViewCell
对象。我必须确保正确创建我的单元格,对应于正确的下载(在给定索引处)并反射(reflect)下载的确切状态。其中一些可能是矫枉过正,但它似乎运作良好。不过,我还没有在仪器中对此进行测试,以查看是否/何时泄漏任何东西:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
DownloadTableViewCell *cell = (DownloadTableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
UIViewController *temporaryController = [[UIViewController alloc] initWithNibName:@"DownloadTableViewCell" bundle:nil];
// Grab a pointer to the custom cell.
cell = (DownloadTableViewCell *)temporaryController.view;
[cell initState];
// Listens for method calls on cell
cell.delegate = self;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
// Set index for this cell (it could be wrong if cell is re-used)
cell.downloadIndex = indexPath.row;
Download *download = [_downloadManager.downloads objectAtIndex:indexPath.row];
cell.downloading = download.downloading;
cell.nameLabel.text = download.name;
cell.descriptionLabel.text = download.description;
cell.downloadProgressView.progress = download.percentageDownloaded;
// Check for completed status
cell.completed = download.completed;
cell.completedFileNameLabel.text = download.fileName;
return cell;
}
最佳答案
在取消下载方法中从集合中删除时,似乎正在释放 outputStream。但是,由于下载被取消,下载实例上的状态不会发生变化。如果该对象继续具有 totalBytes
和 percentageDownloaded
值设置,进度 View 将继续反射(reflect)部分下载的状态。
关于ios - 如何取消 AFHTTPRequestOperation 并且不保留以前的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16091091/
仅使用POSIX shell 的特性,是否有一个“简单命令”,它什么也不做,也不改变$? 的值。人们通常描述:作为 shell 的无操作命令,但这总是设置 $?为零,所以这不是我想要的。 这是生成 s
我需要保留当前的 GlBlendFunc 以便在我做一些工作后可以恢复它。似乎这不是可以用 GLPushAttrib 保存的属性之一,还有其他类似的方法可以用来保存状态吗? 最佳答案 glGet与
我目前正致力于创建 Fuseki 三重存储浏览器的项目。我需要可视化 TripleStore 中的所有数据并使应用程序可浏览。唯一的问题是 QuerySolution 遗漏了三元组中的“”。 如果我使
我知道没有必要保留委托(delegate),以避免保留循环。我在一次采访中碰巧遇到了一个问题,“如果保留了 appDelegate 会怎样?”。我对此没有答案,并根据我的知识在这里寻求答案。谢谢 最佳
我正在用 C 编写第一个更严肃的程序,但我陷入了困境。我需要将此列表排序为不同的单独文件,因此它看起来像这样: BE30B Berlin 2014-04-02 Gale 02 BE30B Berlin
我有 4 个页面,我使用 ajax 和 historyPopState 在它们之间进行更改。但是有一个问题,因为页面非常不同,它们使用不同的样式表和脚本。我可以一遍又一遍地下载它们,但我想问一下是否有
我有一个表单,其中包含从一个表创建的多行(与其他表没有关系)。当我保存表单时,我所做的每项更改都会保存,但数据库中确实有一个额外的空行。请参阅下文(希望)了解所有必要的信息。 PropertyAddi
我正在编写一个可以在 Canvas 上绘制气泡的应用程序。我有 MainActivity,它的布局是一个简单的 LinearLayout,我将其用作 fragment 的容器。当我在 Canvas 上
我想弄清楚为什么我通过这段代码得到 EXC_BAD_ACESS。我没有线索。谁能帮帮我。 - (void)loadJsonFile:(NSString*)fileName { NSError
我正在编写一个代码,它将遍历单词中的每个单词,在字典中查找它们,然后将字典值附加到计数器。但是,如果我打印计数器,我只会从我的 if 语句中获取最后一个数字(如果有的话)。如果我将 print cou
抱歉,标题有点困惑。 我想隐藏这些选择选项,只在用户选择按钮时显示。一旦用户选择了一个按钮,我希望选择字段将继续显示......但是如果用户选择了不同的按钮,我想从以前的选择中重置所选的选项并炫耀。
>>> t = "first%s\n" >>> t = t %("second") >>> print t firstsecond 无论如何我可以保留最后的“\n”并得到“firstsecond\n”
我试图弄清楚如何更改 if 语句中的变量并使其保持全局不变。 用户输入:!change Hi var A = "Hello" if (msg.content.includes ('!change'))
您好,我有一个关于在重新创建 Activity 时保留 fragment 的问题。我听说一种方法是在 onCreate 方法中使用 setRetainFragment(true) 。问题是——这与跟踪
我想知道是否有人可以帮助我解决下面代码中的内存管理问题。我对 rootController 特别感兴趣,它是在我执行 initWithRootViewController 时被保留还是在窗口 addS
我想确保我在这里正确理解了内存管理。是否有任何特殊原因在这里使用其中一种 assignCurrentDate 方法而不是另一种方法?此外,所有这些都不会导致内存泄漏,对吗? 在 .h 中我们有: NS
我对 Angular2 删除尾部斜杠有疑问。我已经设置了我的 dotnet 核心应用程序来添加它们,但是一旦加载了 js,它们就会被删除。 在 Angular2 中甚至可能吗? (我的客户需要它,所以
local_settings.py 反模式的原因之一是把 SECRET_KEY, AWS设置文件中的键等值有问题: secret 通常应该是这样的: secret !将它们保存在版本控制中意味着拥有存
import('./A'); import('./B'); import('./C'); export class Person {}; A、B 和 C 是纯 JS (es5) 库,它们使用全局 wi
df 是一个测试数据框,其中我只想保留 Hits 列中包含 | 字符的行和行其中包含 hits(即 Hit1、Hit2 等)以及 Hits 列中的空白单元格。 df 从开始 (^) 到结束 ($)
我是一名优秀的程序员,十分优秀!