gpt4 book ai didi

ios - NSOperationQueue addOperationWithBlock 返回mainQueue的操作顺序

转载 作者:行者123 更新时间:2023-11-29 02:43:18 24 4
gpt4 key购买 nike

我有一个基本问题,关于NSOperationQueue addOperationsWithBlock 中的操作顺序。

我想做的事情:

[_queue addOperationWithBlock:^{
//starts a new thread to download an image
//returns a response from the server
if (returnResponse != nil) {
//what I need to accomplish:
//1) Update the collectionViewCell with data
//2) Cache the image locally
//3) Save the image name in local database
}
}];

我不需要代码来执行此操作,我只需要知道它是如何工作的。例如,如果我想立即为用户更新单元格,我是否应该像这样立即拥有那部分代码?

if (returnResponse != nil) {
[[NSOperationQueue mainQueue]addOperationWithBlock^{
//update the cell content on the main Thread
}];
//write data to file, save image name in local database
}

我的主要问题是:这样做,缓存图像和保存在本地数据库中是否会在那个单独的线程(用于下载图像的线程)上完成?如果我颠倒顺序(缓存图像,保存在本地数据库中,然后更新单元格),会有什么不同吗?

解决方案:

在尝试了许多不同的方法之后,我在 NSOperationQueue mainQueue 中使用了串行 GCD。尝试保存在 sqlite DB 中时,尽管我正确地完成并关闭了数据库,但一直给我一个 database is locked 错误。我想是因为它试图同时保存,让一个数据库同时打开,而另一个查询试图访问它。所以我的最终解决方案是这样的:

[_queue addOperationWithBlock:^{
//starts a new thread to download an image
//returns a response from the server
if (returnResponse != nil) {
//Cache the image locally
[[NSOperationQueue mainQueue]addOperationWithBlock^{
//use a created GCD serial queue to save the image name in local database
//update the cell content on the main Thread
}];
}
}];

最佳答案

为什么不将 GCD 与并发队列一起使用?您可以执行如下操作:

    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//execute first
dispatch_sync(concurrentQueue, blockOfCode);
//execute second
dispatch_sync(concurrentQueue, blockOfCode);
//execute third: update the UI
dispatch_sync(dispatch_get_main_queue(), blockOfCodeToUpdateUI);

关于ios - NSOperationQueue addOperationWithBlock 返回mainQueue的操作顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25471726/

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