gpt4 book ai didi

objective-c - 使用 grand central dispatch 切换 View

转载 作者:行者123 更新时间:2023-11-29 13:28:57 25 4
gpt4 key购买 nike

我看了很多题目,还是想不通。

我有一个可以在线下载其内容的 UITableview。每个单元格都有一个图像,我使用 GCD 让图像下载。下载的图像将保存到磁盘,并且在每次加载单元格之前检查文件是否已经存在,如果不存在 -> gcd、nsdata 等。

如果有人拥有良好的互联网连接 (wifi),一切都会顺利进行,但是如果我要从一个 View 跳到另一个 View (来回),并且使用我糟糕的 3G 连接,发生的情况是它想要完成它的队列(大约 4 个单元格),但已经分配了一个新的,一个新的,一个新的,最终用户必须等待很长时间才能执行其他人(他看不到),然后实际的 UITableview 得到人口稠密。使用 NSLog 我可以看到,即使我处于不同的 View 中,它仍在下载并制作在屏幕上可见的 uiimages。每个任务大约 100 kb,如果速度很慢(甚至没有互联网连接?!),如果您有很多任务,可能需要一段时间。

我知道取消它是不可能的,但我在其他主题中阅读了有关使用 BOOL 变量的信息,但我并不真正理解它。即使用户离开屏幕时 BOOL 变量发生变化,单元格也已经在队列中了吗?

是否有可能当用户点击我的 Navigationcontroller 中的后退按钮时,他离开了 View ,我更改了队列中 block 使用的数据(清空它),所以没有什么可下载并且 block 将被执行马上(无事可做)。比如,让数组 newsitems 中的每个值都为零?是否可以更改数据源,或者正在等待的 block 在等待时是否已经有了它们的数据源?

然后还有一个问题,这个对当前执行的block没有影响。

有人能给我指出一个好的方向吗?

谢谢。

普拉斯托

最佳答案

您可以使用 NSBlockOperationNSOperationQueue 创建可取消的下载任务。你通过给它一个执行一些工作的 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/

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