UICollectionView 滚动很慢

2023-11-22

我刚刚创建了一个UICollectionView其中用户可以将手机中的图像添加到应用程序的相册功能中。我将图像保存到文档目录中的子目录中,以便可以添加和删除更多图像。但是,当我上下滚动集合视图时,它非常滞后。

怎样才能让滚动条又漂亮又流畅呢?

我的代码:前 16 张图像是预设图像,之后的所有图像都来自文档目录中的子目录

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Custom" forIndexPath:indexPath];
    //Current index number
    int index=indexPath.section * noOfSection + indexPath.row;
    //Check if its the preset photos
    if(index<16){
        NSString *name=[recipePhotos objectAtIndex:indexPath.section * noOfSection + indexPath.row];
        cell.imageView.image=[UIImage imageNamed:name];
    }

//not preset photos, so retrieve the photos the user added
    else {
        NSData *data= [NSData dataWithContentsOfFile:[recipePhotos objectAtIndex:index]];
        UIImage *theImage=[UIImage imageWithData:data];

        cell.imageView.image=theImage;
        data=nil;
    }

    return cell;
}

时间分析器给了我这个

Running Time    Self        Symbol Name
568.0ms   63.1% 0.0     Main Thread  0x4048
320.0ms   35.5% 0.0     _pthread_start  0x405e
320.0ms   35.5% 0.0      thread_start
320.0ms   35.5% 0.0       _pthread_start
320.0ms   35.5% 0.0        0x1084be960
310.0ms   34.4% 1.0         0x1084be6f0
7.0ms    0.7%   0.0         mach_msg
2.0ms    0.2%   2.0         objc_msgSend
1.0ms    0.1%   1.0         -[NSAutoreleasePool release]
4.0ms    0.4%   0.0     _dispatch_mgr_thread  0x4052
4.0ms    0.4%   0.0      _dispatch_mgr_thread
4.0ms    0.4%   0.0       _dispatch_mgr_invoke
4.0ms    0.4%   4.0        kevent
3.0ms    0.3%   0.0     _dispatch_worker_thread2  0x62b24
3.0ms    0.3%   1.0      start_wqthread
3.0ms    0.3%   0.0     _dispatch_worker_thread2  0x62a84
3.0ms    0.3%   0.0      start_wqthread
3.0ms    0.3%   0.0       _pthread_wqthread
3.0ms    0.3%   0.0        _dispatch_worker_thread2
3.0ms    0.3%   0.0         _dispatch_queue_invoke
3.0ms    0.3%   0.0          _dispatch_queue_drain
3.0ms    0.3%   0.0           _dispatch_client_callout
2.0ms    0.2%   0.0            my_io_execute_passive_block
1.0ms    0.1%   0.0             __86-[NSPersistentUIManager writePublicPlistWithOpenWindowIDs:optionallyWaitingUntilDone:]_block_invoke_0835
1.0ms    0.1%   0.0              -[NSPersistentUIManager writePublicPlistData:]
1.0ms    0.1%   0.0               -[NSURL(NSURLPathUtilities) URLByAppendingPathComponent:]
1.0ms    0.1%   0.0                -[NSURL getResourceValue:forKey:error:]
1.0ms    0.1%   0.0                 CFURLCopyResourcePropertyForKey
1.0ms    0.1%   0.0             __block_global_2
1.0ms    0.1%   0.0              -[NSPersistentUIManager writeRecords:withWindowInfos:flushingStaleData:]
1.0ms    0.1%   0.0            _dispatch_call_block_and_release
1.0ms    0.1%   0.0             0x1084b8580
1.0ms    0.1%   0.0              mach_msg_send
1.0ms    0.1%   0.0               mach_msg
1.0ms    0.1%   1.0                mach_msg_trap
1.0ms    0.1%   0.0     _pthread_struct_init  0x62a83
1.0ms    0.1%   0.0      start_wqthread
1.0ms    0.1%   0.0       _pthread_wqthread
1.0ms    0.1%   1.0        _pthread_struct_init
1.0ms    0.1%   0.0     start_wqthread  0x62a7f

您将需要采取一种类似于在表视图中需要执行的方法,您将需要重用视图,就像在表视图中重用单元格一样。

Ray Wenderlich 提供的一个非常好的教程:

在第一部分中,您了解了基础知识,在第二部分中,他们讨论了可重用视图,您看一下链接:

http://www.raywenderlich.com/22417/beginning-uicollectionview-in-ios-6-part-22

Edit

异步加载图像的示例:

在您的单元格中创建一个方法loadImageFromFile例如,它接收您将这样调用的路径:

[cell loadImageFromFile:[recipePhotos objectAtIndex:index]];

然后看起来像(也许你需要适应一些东西......):

- (void) loadImageFromFile:(NSString*)path{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
        NSData *data= [NSData dataWithContentsOfFile:path];
        UIImage *theImage=[UIImage imageWithData:data];

        dispatch_async(dispatch_get_main_queue(), ^{
            cell.imageView.image=theImage;
    });
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UICollectionView 滚动很慢 的相关文章

随机推荐

  • Choropleth 地图:更改“鼠标悬停”中的描边颜色显示重叠边界

    我在分区统计图中遇到鼠标悬停事件的问题 我想突出显示边界 以便用户可以看到当前选择的功能 一切正常 预计某些边界会更细或根本不存在 大概是因为它们渲染在相邻要素的边界下方 这是一个例子 有些边界是正确的 其他部分更细 第三部分根本不存在 最
  • 如何使用 apache vfs2 进行带公钥私钥且无需密码的 sftp

    目前我正在使用 apache vfs2 从 sftp 下载文件 对于身份验证 我使用用户名和密码 有没有一种方法可以仅使用公钥私钥而不使用密码来使用 vfs2 我想我已经用过这个功能了 但是怎么用呢 仅将其设置为 是 SftpFileSys
  • 当compareto返回0时理解TreeSet

    我创建了一个这样的学生课程 public class Student implements Comparable
  • 用户已通过身份验证,但访问令牌在哪里?

    我有一个 Web 应用程序 它使用隐式客户端向 Identity Server 4 验证用户身份 我需要该用户的访问令牌 以便我可以调用另一个 API 需要明确的是 我有一个身份服务器 使用身份服务器 4 创建 我在 Asp net cor
  • “动态atexit析构函数”中的“动态”是什么意思?

    我最近将我的应用程序从 VC 7 移植到 VC 9 现在 它有时会在退出时崩溃 运行时开始调用全局对象析构函数 并且其中之一发生访问冲突 每当我观察调用堆栈时 最上面的函数是 CMyClass CMyClass lt crashes her
  • 如何在Python中使用回调函数?

    我想知道如何正确使用 python 2 7 回调函数 我的代码中有一些来自 Cherrypy auth 示例的回调函数 这些回调返回一个可以计算为 True 或 False 的函数 具体取决于登录用户是否在组中 我想知道如果我写这样一段代码
  • IIS6 中的 ASP.NET MVC 压缩选项

    目前我仍坚持使用 IIS6 for ASP NET MVC 如我还无法升级到 Server 2008 它似乎不知道我的 RESTful URL 是动态文件并且没有压缩它们 我所有旧的 aspx 文件都被压缩 如 Fiddler 中所示 但不
  • 在 vs 2010 中开箱即用运行 asp.net mvc 2 项目时出错

    我创建了一个新的解决方案 它构建了精细的定位框架 4 0 但是当我运行它时 我的浏览器会显示 无法找到该资源 描述 HTTP 404 您正在查找的资源 或其依赖项之一 可能已被删除 名称已更改或暂时不可用 请检查以下 URL 并确保拼写正确
  • c# 如何从日期中删除AM/PM

    我想获取今天的日期时间 但没有 AM PM DateTime dt DateTime Now 给我 23 05 2016 03 16 51 上午 我想要的结果是 2016年5月23日 15 16 51 The DateTime本身不保留任何
  • ASP.NET Core 中信任本地 HTTPs 证书时出现问题

    我正在按照在线教程创建 ASP NET Core Web 应用程序 我遵循了一切 但无法信任本地 HTTPS 证书 当我第一次运行该应用程序时 我收到一条错误消息 访问控制列表 acl 结构无效 我尝试用谷歌搜索此错误 但找不到与我的 AS
  • 使用 vbscript 创建 Excel 文件

    如何使用以下命令创建 Excel 文件VBScript 我搜索了网络 但它只提到打开现有文件 这是从网上提取的如下图 Set objExcel CreateObject Excel Application Set objWorkbook o
  • 是否可以中断 ExecutorService 的特定线程?

    如果我有一个ExecutorService我向其提供可运行任务 我可以选择一个并中断它吗 我知道我可以取消返回的未来 也提到这里 如何中断执行器线程 但是我怎样才能提高InterruptedException Cancel 似乎没有做到这一
  • 如何在 AsyncTask 中从 onPostExecute 发送回数据?

    我的问题与此相同Activity 的实例变量未在 AsyncTask 的 onPostExecute 中设置或如何将数据从 AsyncTask 返回到主 UI 线程但我想将数据发送回同一个调用活动 不启动意图的活动总是重新启动活动 一种选择
  • 读取 JPG 文件的 XMP 元数据

    我正在开发 Android 应用程序 该应用程序应该利用 Google 相机的新深度图生成功能 基本上谷歌已经描述了所使用的元数据here 我可以访问大部分元数据 但不幸的是 最重要的数据被编码为extendXmp 并且我无法获得任何XMP
  • sql server 将日期转换为字符串 MM/DD/YYYY

    我正在使用 SQL Server 2008 我有以下内容 select convert varchar 20 fmdate from Sery 如何将日期转换为字符串 使其显示为 MM DD YYYY 该任务应该由软件堆栈中的下一层来完成
  • 如何在 C++ 中编码大型复杂的常量数据结构

    过去 我使用过 gccC99 样式复合文字扩展到 C 来编码代码中的嵌套常量数据结构 这是一个例子 include
  • 获取文档中的所有链接

    给定 Google Docs Drive 中的 普通文档 例如段落 列表 表格 其中包含分散在整个内容中的外部链接 如何使用 Google Apps 脚本编译存在的链接列表 具体来说 我想通过搜索来更新文档中所有损坏的链接oldText在每
  • Instagram Instagram 标题不起作用

    我有以下用于在 Instagram 上分享文章的代码 void shareInstagram NSURL instagramURL NSURL URLWithString instagram app if UIApplication sha
  • 如何将外部 DOM 附加到 React 组件?

    我有一个页面 其中包含在服务器中呈现的表单 它处理验证以及选择的正确值 我想隐藏该表单的 DOM 并将其附加到 React 组件中 以便我可以在 React router 中使用它 const NewItem React createCla
  • UICollectionView 滚动很慢

    我刚刚创建了一个UICollectionView其中用户可以将手机中的图像添加到应用程序的相册功能中 我将图像保存到文档目录中的子目录中 以便可以添加和删除更多图像 但是 当我上下滚动集合视图时 它非常滞后 怎样才能让滚动条又漂亮又流畅呢