2

在我的 iOS 应用程序中,我在 viewDidLoad 方法中调用了一个名为loadData方法

loadData从本地 SQLite 数据库获取数据并填充项目数组。

在另一种方法showData中,我获取加载的数据并将其显示在实际屏幕上。

- (void)viewDidLoad {
    [super viewDidLoad];
    [self loadData];
    [self showData];
}

- (void)loadData {
    //connects to local SQLite database
    //data is loaded into a NSMutableArray called 'myData'
}

- (void)showData {
    UIImage *myImage = [UIImage imageNamed:[myData objectAtIndex:0]];
    self.imageView.image = myImage;
}

但是,这目前不起作用,因为方法loadData需要一些时间来填充我的数组。

我想显示一个自定义进度指示器视图,它会在屏幕上弹出一个我制作的旋转图像。这将出现直到方法loadData完成,然后showData将运行。

有人可以指出我正确的方向或将我链接到这样做的方法吗?太感谢了!

4

1 回答 1

0

这样做的方法是在后台队列中异步进行数据库检索。执行多线程数据库操作可能会很棘手,一个简单的解决方案是简单地创建一个专用的串行后台队列,您将在其中执行所有数据库交互(因此数据库操作本身在单个线程上运行) . 因此,加载数据的后台进程会将数据库操作分派到此队列,否则您将从主队列中执行的任何数据库交互也会如此。

如果您使用的是FMDB,则可以使用 来执行此操作FMDatabaseQueue,它会为您处理所有这些。或者你可以自己写。(不过,我鼓励您查看 FMDB。如果没有其他问题,请查看它的运行情况FMDatabaseQueue并在您自己的代码中采用这种模式。)

如果您这样做,将初始负载分派到将通过这个单独的专用串行数据库队列执行所有数据库交互的后台队列,只需确保将进度指示器的 UI 更新分派回主队列,因为所有 UI 交互都应该发生在主队列上。

话虽如此,但绝对没有理由为什么对用户界面的数据库查询应该如此缓慢以至于需要这样做。我想知道是否值得深入研究为什么您的数据库代码如此缓慢,并且您也许可以完全摆脱困境。

数据库操作效率低下的一个典型示例是在数据库中存储图像时。除非您正在处理非常小的缩略图图像,否则 SQLite 在处理 BLOB 数据时效率低下是出了名的。典型的解决方案是将图像存储在持久存储(例如您的Documents文件夹)中,并且仅将对这些路径的引用保存在数据库中。这提供了各种潜在的优化。

在您的评论中,您提到数据库维护图像的 URL。好吧,在这种情况下,您可以避免在您的例程中检索图像loadData,而是使用图像的“延迟加载”,即仅在需要时才以即时方式加载图像。您可以使用执行异步加载的类别来实现此UIImageView目的,例如,SDWebImage或者,如果您已经在使用AFNetworking,则可以使用其UIImageView类别。如果你google“延迟加载UIImage”,你可能会发现大量精彩的链接、教程等。但这两个类别不仅提供了简单的“延迟加载”机制,还提供了图像缓存等。

但理想的场景,与其为缓慢的加载过程设计进度视图,不如重构你的设计,彻底消除这个性能瓶颈。为低效的加载界面设计进度视图将是一种耻辱。

于 2013-06-12T17:24:32.783 回答