异步加载图像到 UICollectionView?

2023-11-24

我如何将图像加载到UICollectionview异步? 下面的方法里面?

- (PSTCollectionViewCell *)collectionView:(PSTCollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

 bookImage = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", docPath, [[preview objectAtIndex:indexPath.row] lastPathComponent]]];
 [[cell grid_image] setImage:bookImage];

}

In viewdidload()我正在使用以下异步调用将图像加载到“预览”NSMutablearray

 dispatch_queue_t imageLoadQueue = dispatch_queue_create("com.GMM.assamkar", NULL);

dispatch_async(imageLoadQueue, ^{
    //Wait for 5 seconds...
    usleep(1000000);
    docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];


    for(int k=0; k <[allImage count] ;k++){


        imgURL = [allImage objectAtIndex:k];
        [imagePreview addObject:imgURL];
        imgData=[NSData dataWithContentsOfURL:[NSURL URLWithString:imgURL]];


        [imgData writeToFile:[NSString stringWithFormat:@"%@/%@", docPath, [allImage lastPathComponent]] atomically:YES];

    }

    [[self collectionView] reloadData];


});

请帮助我..现在加载时间太长了...


尝试回答您的主要问题“我如何将图像加载到UICollectionview异步?”

我建议“娜塔莎·穆拉舍夫" here,这对我来说效果很好而且很简单。

If here imgURL = [allImage objectAtIndex:k]; in allImage属性,您保留 URL 数组,然后更新您的collectionView:cellForItemAtIndexPath:像这样的方法:

- (PSTCollectionViewCell *)collectionView:(PSTCollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSURL *url = [NSURL URLWithString:[allImage objectAtIndex:indexPath]];

    [self downloadImageWithURL:url completionBlock:^(BOOL succeeded, NSData *data) {
        if (succeeded) {
            cell.grid_image.image = [[UIImage alloc] initWithData:data];
        }
    }];
}

并添加方法downloadImageWithURL:completionBlock:到您的类,它将异步加载图像并在成功下载图像时自动更新 CollectionView 中的单元格。

- (void)downloadImageWithURL:(NSURL *)url completionBlock:(void (^)(BOOL succeeded, NSData *data))completionBlock
{
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        if (!error) {
            completionBlock(YES, data);
        } else {
            completionBlock(NO, nil);
        }
    }];
}

我看到您尝试在视图出现之前预加载图像,所以也许我的解决方案不是您想要的,但从您的问题来看很难说。无论如何,你也可以通过这个实现你想要的。

斯威夫特2.2Swift 中的解决方案。

public typealias ImageFetchCompletionClosure = (image: UIImage?, error: NSError?, imageURL: NSURL?) -> Void

extension String {
   func fetchImage(completionHandler: (image: UIImage?, error: NSError?, imageURL: NSURL?) -> Void) {
        if let imageURL = NSURL(string: self) {
            NSURLSession.sharedSession().dataTaskWithURL(imageURL) { data, response, error in
                guard
                    let httpURLResponse = response as? NSHTTPURLResponse where httpURLResponse.statusCode == 200,
                    let mimeType = response?.MIMEType where mimeType.hasPrefix("image"),
                    let data = data where error == nil,
                    let image = UIImage(data: data)
                    else {
                        if error != nil {
                            completionHandler(image: nil, error: error, imageURL: imageURL)
                        }
                        return
                }
                dispatch_sync(dispatch_get_main_queue()) { () -> Void in
                    completionHandler(image: image, error: nil, imageURL: imageURL)
                }
            }.resume()
        }
    }
}

使用示例:

    "url_string".fetchImage { (image, error, imageURL) in
        // handle different results, either image was downloaded or error received
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步加载图像到 UICollectionView? 的相关文章

  • 在 Pages 文稿中打开文本—Swift

    在我的 Swift 2 应用程序中 用户通过文本字段创建一串文本 然后将其共享给另一个应用程序 现在 我只能将文本共享为 txt 文件 这不提供选项Open In Pages当我打开系统共享对话框时 如何才能让用户可以选择将输入的文本作为
  • 如何将 .ipa 转换为 .app 文件?

    每个人 我有一些 ipa 文件 想要转换为包含 app 包的存档文件 我试图这样做 但我没有办法 有什么办法可以做到这一点吗 请帮我 将 ipa 重命名为 zip 然后提取即可
  • supportedInterfaceOrientations 方法不会重写其超类中的任何方法

    在 UIViewController 中 这段代码 public override func supportedInterfaceOrientations gt UIInterfaceOrientationMask if let mainC
  • iOS FacebookSDK + 解析 SDK + GoogleMaps SDK

    我搜索了很多 然后我意识到 ObjC标记那个GoogleMapSDK需要 但不能很好地配合ParseSDK and FacebookSDK 所以我阅读了所有的 stackoverflow 答案并尝试解决我的问题 问题还没有解决 我执行的步骤
  • 如何将 NSMutableArray 添加到 NSMutableArray Objective-c

    我正在从 Java 切换到 Objective c 但遇到了一些困难 我已经搜索过这个问题但没有取得太大成功 我有一个存储 NSMutableArrays 的 NSMutableArray 如何向数组添加数组 您可以在数组中存储对另一个数组
  • Swift:Tableview 在导航栏下方滚动但在状态栏上方滚动?

    我使用以下技巧隐藏了导航栏的阴影 self navigationController navigationBar setBackgroundImage UIImage for default self navigationControlle
  • 如何在导航栏上添加 UIView?

    我需要覆盖UINavigationBar with UIView像这儿 除了使用带有按钮返回的自定义 UIView 作为导航栏之外 还有其他方法可以做到这一点吗 您可以将子视图添加到应用程序的基本视图 UIApplication share
  • 使用 JSONKit 解析 JSON 文件

    我正在构建一个音叉应用程序 货叉应允许最多 12 个预设节距 此外 我希望允许用户选择一个主题 每个主题都会加载一组预设 不必使用所有预设 我的配置文件看起来像这样 theme A3 comment An octave below conc
  • 在 Xcode 中查找未使用的文件

    我最近开始开发一个新应用程序 它基本上是我以前制作的应用程序的副本 但做了一些更改 为了制作这个新应用程序 我复制了旧应用程序并删除了一些不需要的内容 我想知道 有没有办法知道 Xcode 中正在使用哪些类文件 或者有什么关于如何查找未使用
  • 在 Swift 中的 For 循环中更改对象的属性

    我创建了一个名为 ShoppingList 的简单结构 struct ShoppingList var shoppingListId NSNumber var title String var groceryItems GroceryIte
  • 如何使用 didMoveToView 作为 initWithSize ?

    我将 Xcode 更新到版本 6 从那时起 我就无法使用以前在 Xcode 5 中使用 Objective C 编写的代码了 有一些新文件 GameScene h 和 GameScene m 以及 GameScene sks 而不是 MyS
  • 为什么 Apple 建议以编程方式创建模态导航控制器?

    以模态方式呈现导航控制器时 以编程方式创建和配置导航控制器对象通常更简单 虽然您也可以使用 Interface Builder 来执行此操作 但通常不建议这样做 事实上 因为我的导航控制器很简单 我宁愿在IB中自定义视图 虽然我不知道确切的
  • 依赖于不同队列上的另一个操作的 NSOperation 无法启动

    我有操作的依赖图 并且使用多个队列来组织各种操作流 例如 peopleQueue sitesQueue sessionQueue sessionQueue loginOp fetchUpdatedAccountOp peopleQueue
  • iOS 有 INTERNET 权限吗?

    我在 iOS 设备上的 flutter dio 包上遇到了一个奇怪的问题 我编写了一个向 url 发送 GET 请求的应用程序 Android 上一切正常 但 iOS 上的请求似乎无法通过 没有发生任何错误 什么也没有 我在 Android
  • 使用标识符启动 iPhone 应用程序

    我正在尝试在我的应用程序中启动应用程序 例如 如果我按下 testApp1 中的按钮 它应该打开 testApp2 有没有办法用应用程序标识符来做到这一点 我听说过一种名为的未记录方法launchApplicationWithIdentif
  • 自动生成的 Swift 桥接标头中“找不到接口声明”

    我当前的项目包含 Swift 和 Objective C 代码 两种类型的源文件都使用另一种语言的代码 当我进行完全清理并重新编译时 几乎每个 Swift 类声明都出现错误Module Swift h 形式为 Cannot find int
  • 找不到 Cocoa/Cocoa.h 文件

    我在用XMPPFramework在我的应用程序中 我已将 Cocoa Cocoa h 导入到我的 m 文件中 但是当我构建项目时Xcode显示错误 错误 未找到 Cocoa Cocoa h 文件 我该如何解决这个错误 如果您正在为 iOS
  • 具有隐式授权的 OAuth 应用程序中的客户端模拟

    来自 OAuth 草案 隐式section https datatracker ietf org doc html draft ietf oauth v2 31 section 1 3 2 在隐式授权流程期间发出访问令牌时 授权服务器不对客
  • iOS 目标 c 中的 AES/CBC/PKCS5Padding 结果与 Android 不同

    我在 Android 应用程序中使用 AES CBC PKCS5Padding 代码就像 private static String TRANSFORMATION AES CBC PKCS5Padding private static St
  • 从应用程序内发送电子邮件中的图像和文本

    如何从我的应用程序内通过电子邮件发送图像和文本 表格数据形式 请大家帮忙并提出建议 谢谢 void sendMailWithImage UIImage image if MFMailComposeViewController canSend

随机推荐

  • Android 打开外部存储目录(sdcard)用于存储文件

    我想打开外部存储目录路径以编程方式保存文件 我尝试过但没有获取 SD 卡路径 我该怎么办 有什么解决办法吗 private File path new File Environment getExternalStoragePublicDir
  • 延长课程是一个好的做法吗?

    我的数据库类中有一个 PDO 连接 最近我一直使用它作为其他类的扩展 即class Users extends Database这使我能够始终保持数据库连接 而无需在我的 Users 类中拥有函数 然而 有人指出我不应该这样做 因为这是一种
  • 分号有什么作用?

    我在网上找到了一个函数来帮助我完成当前的项目 并且它的某些行上有分号 我想知道为什么 是为了破坏功能吗 def containsAny self strings alphabet abcdefghijklmnopqrstuvwxyz0123
  • JQuery/JQuery UI 水平分隔线

    最近 我正在开发一个网站 我想创建一个水平分隔线 能够使用 jquery 调整页面上两个元素的大小 基本上 Content 您还可以查看UI Layout jQuery 插件 这是一个demo
  • 如何在链接的 npm 依赖项(开发中)和已安装的依赖项(暂存/生产中)之间切换?

    我正在开发一个自定义 npm 模块 并且它有一个 GitHub 存储库 我还在开发一个使用自定义模块的项目 当处理较大的项目时 使用它是很好的npm link这样我就可以对模块进行更改并立即在主项目中看到它们 To deploy to st
  • 在flutter中,如何将facebook受众作为中介网络与Admob集成?

    我是广告中介新手 我有一个 flutter 应用程序 并且使用以下 admob flutter 插件集成了 admob 并且它在 Android 和 iOS 上运行良好 https pub dev packages admob flutte
  • 暴雪官方魔兽世界 API 在哪里?

    我想知道是否可以通过 API 访问 魔兽世界 我的要求非常明确 必须是暴雪官方API 必须可以在游戏外访问 暴雪现已发布社区 API 允许您直接从暴雪服务获取信息 例如领域状态 玩家和拍卖数据 https dev battle net io
  • 使用构建参数构建 Docker 映像并将其从 DevOps 推送到 ACR

    我正在 Azure DevOps 管道中构建 Docker 映像 然后我想将其推送到 Azure 容器注册表 注册表已创建 并且我已配置 DevOps 来使用它 还有buildAndPushDocker任务 works 然而 由于 Dock
  • Android - 检索联系人照片并显示

    我正在创建一个简单的应用程序 用于检索每个联系人的姓名和电话号码 并在列表视图中显示 并在行开头的缩略图大小的图像视图中显示联系人的照片 我已成功检索并显示姓名和号码 但在浏览了许多教程和堆栈后未能显示照片 我最终将其恢复为仅显示姓名和号码
  • 如何生成动态 GRF 图像以进行 ZPL ZEBRA 打印

    我有个问题 我正在生成动态 BMP 图像并尝试通过 ZPL 命令将其发送到 ZEBRA 打印机 我需要将 BMP 图像转换为 GRF 图像 我认为 BMP 图像提取的十六进制不正确 打印的图像模糊且不正确 这是我的代码 string bit
  • 在java中计算两个双精度数的余数

    我有以下代码 Double x 17 0 Double y 0 1 double remainder x doubleValue y doubleValue 当我运行这个时 我得到余数 0 09999999999999906 知道为什么吗
  • 在 JavaFX 控制器中获取单击对象的 id 的更好方法

    我正在寻找一种更好的方法来获取该对象的事件处理程序中单击的对象的 id 我已经找到了这个 javafx 将 fx id 传递给控制器 或 fxml onAction 方法中的参数 但这对我不起作用 现在我使用节点类的 getId 函数 如下
  • 如何使用 boost::spirit 匹配 unicode 字符?

    如何使用 utf8 unicode 字符匹配boost spirit 例如 我想识别这个字符串中的所有字符 echo a out 当我尝试这个简单的boost spirit程序将无法正确匹配 unicode 字符 include
  • Spark csv读取速度很慢虽然我增加了节点数

    我在 Google Compute Engine 上创建了两个集群 这些集群读取 100 GB 数据 集群一 1 个主控 15 GB 内存 250 GB 磁盘 10 个节点 7 5 GB 内存 200 GB 磁盘 集群二 1 个主控 15
  • 在 MySQL 中使用/存储加密密钥的最佳方法是什么

    我计划使用 MySQL 及其内置加密功能来加密 解密某些表中的某些列 我担心的是我需要将密钥存储在某个地方 我当然可以将密钥存储在文件中并控制该文件的权限以及访问它的应用程序的权限 但这足够了吗 我还可以创建一个网络服务来获取密钥或其他东西
  • 进程间通信选项

    我需要在一个应用程序内订阅另一个应用程序公开的事件 我注意到许多人认为使用 WCF 命名管道是最佳实践 如果我选择 WCF 命名管道 我就必须使用 IIS 对吗 顺便问一下 我一般有哪些选择 命名管道是在同一台机器上进行 IPC 进程间通信
  • 如何使用泛型参数为任何方法构建表达式调用

    我只是尝试使用 Linq Expression 制作如下相同的表达式 Expression
  • ckfinder 调整图像大小

    使用 ckfinder 选择或上传图像后 用户可以更改宽度和高度 我希望它自动将图像大小调整为用户设置的宽度和高度 那可能吗 我认为 ajax 图像调整器可以解决这个问题 但无法让它工作 有人有自动宽度和高度调整大小插件的经验吗 在我的 c
  • 将大量 csv 文件导入 PostgreSQL 数据库的有效方法

    我看到很多将 CSV 导入 PostgreSQL 数据库的示例 但我需要的是一种将 500 000 个 CSV 导入单个 PostgreSQL 数据库的有效方法 每个 CSV 略多于 500KB 总计约 272GB 数据 CSV 的格式相同
  • 异步加载图像到 UICollectionView?

    我如何将图像加载到UICollectionview异步 下面的方法里面 PSTCollectionViewCell collectionView PSTCollectionView collectionView cellForItemAtI