- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看了很多题目,还是想不通。
我有一个可以在线下载其内容的 UITableview。每个单元格都有一个图像,我使用 GCD 让图像下载。下载的图像将保存到磁盘,并且在每次加载单元格之前检查文件是否已经存在,如果不存在 -> gcd、nsdata 等。
如果有人拥有良好的互联网连接 (wifi),一切都会顺利进行,但是如果我要从一个 View 跳到另一个 View (来回),并且使用我糟糕的 3G 连接,发生的情况是它想要完成它的队列(大约 4 个单元格),但已经分配了一个新的,一个新的,一个新的,最终用户必须等待很长时间才能执行其他人(他看不到),然后实际的 UITableview 得到人口稠密。使用 NSLog 我可以看到,即使我处于不同的 View 中,它仍在下载并制作在屏幕上可见的 uiimages。每个任务大约 100 kb,如果速度很慢(甚至没有互联网连接?!),如果您有很多任务,可能需要一段时间。
我知道取消它是不可能的,但我在其他主题中阅读了有关使用 BOOL 变量的信息,但我并不真正理解它。即使用户离开屏幕时 BOOL 变量发生变化,单元格也已经在队列中了吗?
是否有可能当用户点击我的 Navigationcontroller 中的后退按钮时,他离开了 View ,我更改了队列中 block 使用的数据(清空它),所以没有什么可下载并且 block 将被执行马上(无事可做)。比如,让数组 newsitems 中的每个值都为零?是否可以更改数据源,或者正在等待的 block 在等待时是否已经有了它们的数据源?
然后还有一个问题,这个对当前执行的block没有影响。
有人能给我指出一个好的方向吗?
谢谢。
普拉斯托
最佳答案
您可以使用 NSBlockOperation
和 NSOperationQueue
创建可取消的下载任务。你通过给它一个执行一些工作的 block 来创建一个 NSBlockOperation
。在您的情况下,该 block 将下载 URL 的内容。
在您的 View Controller 中,您将存储已提交到队列的操作列表。如果用户决定离开当前 View ,您可以对每个未决操作调用 cancel
以防止发生任何不必要的工作。然而,当前运行的操作将运行完成。为了取消当前正在运行的操作,您需要在执行此操作的 block 中存储对 NSOperation 对象的弱引用。然后在 block 体内的适当时间间隔内,您可以检查操作是否已被取消并提前退出。
// Create a queue on which to run the downloads
NSOperationQueue* queue = [NSOperationQueue new];
// Create an operation without any work to do
NSBlockOperation* downloadImageOperation = [NSBlockOperation new];
// Make a weak reference to the operation. This is used to check if the operation
// has been cancelled from within the block
__weak NSBlockOperation* operation = downloadImageOperation;
// The url from which to download the image
NSURL* imageURL = [NSURL URLWithString:@"http://www.someaddress.com/image.png"];
// Give the operation some work to do
[downloadImageOperation addExecutionBlock: ^() {
// Download the image
NSData* imageData = [NSData dataWithContentsOfURL:imageURL];
// Make sure the operation was not cancelled whilst the download was in progress
if (operation.isCancelled) {
return;
}
// Do something with the image
}];
// Schedule the download by adding the download operation to the queue
[queue addOperation:imageDownloadOperation];
// As necessary
// Cancel the operation if it is not already running
[imageDownloadOperation cancel];
今年的 WWDC 上就这个确切主题进行了一场题为“在 iOS 上构建并发用户界面”的精彩演讲。您可以找到视频和幻灯片 here
关于objective-c - 使用 grand central dispatch 切换 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12338030/
由于 JCenter 将于 2021 年 5 月 1 日关闭。发布闭源库还有哪些其他选择?。我在网上搜索过,但无法获得任何可靠的最新信息。 我的公司可以通过哪些选项通过 Maven Central 提
我尝试使用gradle将一些 Artifact 上传到Maven Central(well actually to the sonatyp repository)。 我按照this nice arti
我想发布我的 OSS 库,以便在 jcenter 和 maven-central 存储库中可用。我有 2 个与此主题相关的问题: 我应该自己发布到两个存储库,还是它们之间有一些自动同步,所以只发布到其
我目前正在为我的团队开发多个项目管理应用程序,并将它们作为 JAR 分发,目前还可以。但我被要求制作一个中央应用程序来启动它们。 基本上是一个小应用程序,我已经制作的每个应用程序都有一个按钮,当您单击
我是 Java 8 java.time JSP tags 的维护者图书馆。我自己出版图书馆的经验很少。为了发布这个库,我做了一些研究并以 gradle 构建脚本 that you can check
更新:请参阅followup question 我有一个 Java 库,其构建过程完全用 Ant 编写。项目的沙箱(源目录,我在其中编辑代码)是 R:\jeffy\programming\sandb
,在Gradle仍然无法正常工作的情况下,将aar文件发布到Maven Central: 好的,让我们重复我为“使用Gradle将aar文件发布到Maven Central”(我主要遵循此guide)
随着OpenCL 2.0的引入,OpenCL似乎具有Grand Central Dispatch(GCD)的许多功能,例如CLang / Apple样式块和队列。看一下它们各自的功能集,我想知道Ope
我正在更新 javassist 库的版本,并注意到 maven 存储库站点上的最新版本 ( 3.22.0-CR1 ) 具有红色背景,但通过快速搜索,我无法找出原因。 谁能解释一下那个红色背景是什么意思
我正在使用 docker compose image 将 jbpm 与 postgresql 连接起来。 我通过更改安全域部分的登录模块,通过数据库用户完成了业务中心的身份验证。 数据库用户成功登录后
我正在寻找一些简单的异步变通方法,例如GCD,但在QT中,是否有任何这种方法或仅线程和工作器? 最佳答案 简而言之:Qt中有什么实现基于任务的并发? 该功能称为Qt Concurrent。我记得,只要
我写了一个名为LibA的aar库,它取决于我的aar库LibB和LibC。 LibB和LibC已经上传到maven中,但是我的LibA目前无法通过相同的Gradle任务进行构建,因为我必须等待大约20
我正在尝试创 build 备组,以最终使用该特定设备组创建一个作业,以向其中的所有设备发送重新启动命令。我使用 IoT Central API REST 来实现此目的,其 URL 如下所示(这就是其
在其他数据(特别是字符串)中,我从JSON中提取了一个URL,并将其保存在数组“jsonArray”中。我需要将该URL(用于与登录用户有关的图像)转换为可以在我的imageview“imagePro
我写了this project并且已经在我的其他库中使用它。 但是,我发现有些不对劲。也就是说,在该库的每个用户中,我创建一个实用程序类,其唯一作用是提供一个或多个 MessageBundle。这很糟
我作为开发人员被添加到 Maven 项目中,现在我需要发布一个版本。我已将 nexus-staging-maven-plugin 添加到 pom.xml 文件。 org.sonatype.plu
基本上,我想在运行依赖于上传图像的其他功能之前上传一些图像。我想我可能对 GCD 是什么/线程如何工作有误解。我希望功能 1 和 2 在上传图像后发生。它们执行起来都很快,但严重依赖上传图像才能完成。
我一直在看this question尝试解决我的问题 here . tl;dr 是我想使用 GCD 让我在执行某些任务时显示“等待”屏幕,然后在完成后隐藏屏幕。现在,我有 - (void) doStu
我有一个包含多个模块的项目。我大部分都使用 pom 打包,当然还有一些 jar 模块。现在,我需要在 Maven Central 上进行部署。我关注了this tutorial . 当我运行建议的 s
DIV "central"居中,ok!,好!但是:为什么内容不?请帮忙。 谢谢 Center Content html,body{background:#aa0000;color:#fae803;}
我是一名优秀的程序员,十分优秀!