我正在制作一个iPhone应用程序,它的数据形成了我正在编写和托管的WCF服务。我正在使用MonoTouch来编写iPhone客户端。我的一个屏幕上有一个表格,其中显示了一个项目列表(最多约100个项目)。每个项目都有一个要在自定义单元格上显示的图像。为了节省必须最初加载所有图像我预先加载项目列表,然后激活调用服务的线程以检索GetCell方法中的每个单元格图像。一旦检索到图像,我将其存储在字典中,并在下次渲染单元格时从那里检索它以保存第二次服务调用。这意味着图像仅在需要时加载,一次从服务加载,然后从字典加载。我正在使用类似于以下文章中所示的代码;
这在模拟器中运行良好,但是当我将它部署到测试设备(本地WiFi上的iPhone 4)时,我遇到了一些我希望有人可以帮助我的问题。
当我最初加载列表时,一切都很顺利。当我向下滚动列表(快速向上滑动手指)时,设备断断续续。看起来对服务的调用是延迟滚动。我已经取出了在单元格上绘制结果图像的代码,以便从例程中对此进行折扣,因为我猜这将是罪魁祸首,但它仍然引用滞后。我使用ThreadPool.QueueUserWorkItem方法调用我的'GetImage'方法并传入对我的自定义单元控制器的引用,所以我希望在另一个线程上发送调用,然后程序应该继续,而不是中断UI,但我想知道我是否传递了对单元控制器的引用是否导致它成为虚拟列表的问题?
其次,如果我快速向上和向下滚动列表以便进行大量调用,然后导航回我之前的屏幕以更改列表条件,看起来我必须等到现有的调用被返回在我可以在我的标准页面上制作另一个之前 - 这比我想要的时间更长。当我离开屏幕时,有没有办法丢弃现有的电话,因为它们将不再需要?
提前感谢您的帮助。
的Al。
答案 0 :(得分:1)
假设静态图像文件适用于您的用例,我建议您将所有图像放在Web服务器上,并将它们作为URL直接访问。要获取图像,您需要直接转到WebClient class并绕过所有WCF开销。
作为一般优化,您可能希望使用新的ASP.NET 4 Web API框架创建基于HTTP的服务,该框架允许直接通过HTTP而不是构建基于SOAP的WCF服务。
答案 1 :(得分:0)
我们已经实现了一个解决方案,该解决方案使用ashx
http处理程序根据特定网址的查询字符串返回图像。
然后我们使用Miguel's Image Loader来分类缓存等。
我不认为开箱即用,ImageLoader
支持来自WCF调用的图像,但是(正如Sixto Saez所说),将图像作为图像提供可能更有效而不是SOAP消息。