我得到了一个 UITableView,其中填充了未知数量的行。每行包含(例如 3 个)图像,应用程序从网络服务收集此信息。
对于 UITableView,我实现了无限滚动。每当表几乎达到当前行数的末尾时,我都会启动对 web 服务的调用,以获取接下来的 50 行数据。我在 UITableView 调用的 scrollViewDidScroll 方法中执行此操作。
- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat actualPosition = scrollView.contentOffset.y;
float bottomOffset = 450;
if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
bottomOffset = 1000;
CGFloat contentHeight = scrollView.contentSize.height - bottomOffset;
if (actualPosition >= contentHeight && !_loading && !_cantLoadMore)
{
self.loading = YES;
_currentPage++;
NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];
[dict setObject:[NSNumber numberWithInt:_currentPage] forKey:@"page"];
[dict setObject:[_category objectForKey:@"ID"] forKey:@"category"];
[self performSelectorInBackground:@selector(getWallpapersInBackground:) withObject:dict];
}
}
UITableView 的行中的图像是延迟加载的。每当一行可见时,图像就会在单独的线程中加载,并在图像完全下载后更新行。我用于延迟加载的原则与 Apple 在其文档中建议的相同。该图像也被添加到本地 NSDictionary,因此我可以在该行滚出屏幕并返回(并重新创建该行)时获取它。
因为单个 View 中的图片数量可能高达 2000 - 3000,所以我还将图片缓存到磁盘,并在图片距离超过 X 行时从 NSDictionary 中清除图片.当用户再次向下和向上滚动时,会发生以下情况:
UIImage 添加到 NSDictionary 以更快地缓存需要触手可及的图像。 中的 UIImage 对象过多),从 NSDictionary 中删除行、15 行或更远的图像>NSDictionary 导致内存不足错误)。当 UITableView 快要结束时,会发生以下情况:
numberOfItemsInSection 方法。reloadData 以确保 UITableView 填充额外的新行。所以,我遇到的问题是当我从网络服务添加新记录时。当我在 UITableView 上调用 reloadData 时,一些图像再次从磁盘加载,并且在滚动时出现一些问题。
我正在为此寻找解决方案。我尝试将 insertItemsAtIndexPaths 与新行的数量一起使用,将它们添加到 UITableView,但这使得我的延迟加载方法已经下载了图像(因为不知何故所有单元格都在那个时候创建,即使它们不可见,在创建过程中检查单元格是否可见会产生意想不到的结果,图像未加载,单元格看起来很奇怪等)。
因此,我主要寻找的是无限滚动 UITableView 的解决方案,它可以延迟从网络/磁盘加载图像,并且与照片应用程序一样流畅。由于图像都在单独的线程中加载,我不明白为什么滚动不如婴儿的皮肤那么光滑。
最佳答案
我不确定我是否完全理解你问题的全部内容,但以下是我在遇到类似问题时所做的一些事情。
我使用 -tableView:cellForRowAtIndexPath: 作为从网络加载更多数据的提示。当 indexPath.row + 10 >= self.data.count 加载更多数据时,我选择了一个数字(在我的例子中是 10)。
-tableView:cellForRowAtIndexPath:。-scrollViewDidScroll: 循环。我将 UIImageView 子类化为一个可以异步加载图像的类,我称之为 URLImageView。
-tableView:cellForRowAtIndexPath: 中,我为 URLImageView 实例分配了一个 URL。我有一个包含数百(但不是数千)张图像的表格 View 。我一次在屏幕上只有 2 或 3 个表格单元格。
-refreshData:效果非常好。URLImageView 淡入图像。这是一个非常好的效果。希望对您有所帮助。
关于iphone - 具有无限滚动和延迟加载的 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11273767/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use