我正在制作一个 iOS 应用程序,需要显示来自远程站点(来自 URL)的一些图像,每次用户进入应显示图像的屏幕时,应用程序都会冻结,直到下载完成。所以我想将已经下载的图像存储到名为 COVERS 的 SQLite 表中。
这是我如何下载和显示图像的代码:
假设 movieCover 是UI图像视图并且对象电影有一个NSURL名为 cover 的属性包含要下载的图像的 URL。
NSData *cover = [[NSData alloc] initWithContentsOfURL:movie.cover];
movieCover.image = [[UIImage alloc] initWithData:cover];
但是,我想把它改成这样:
NSData *cover = [appDelegate.dataBase getCoverForMovie:movie];
if( !cover ) {
cover = [[NSData alloc] initWithContentsOfURL:movie.cover];
[appDelegate.dataBase setCover:cover ToMovie:movie];
}
movieCover.image = [[UIImage alloc] initWithData:cover];
假设appDelegate是当前ViewController的属性,dataBase是AppDelegate的属性,AppDelegate使用FMDB来操作DataBase中的数据。
我需要使用以下方法获取之前保存在数据库中的封面:
- (NSData *)getCoverForMovie:(Movie *)movie;
但是,如果没有保存封面,则返回零。
所以我需要使用该方法保存封面
- (BOOL)saveCover:(NSData *)cover ForMovie:(Movie *)movie;
但我不知道如何编写这个方法。需要一些帮助。
基于fmdb.m示例的方法实现
- (NSData *)getCoverForMovie:(Movie *)movie
{
NSData *cover = nil;
FMDatabase *db = [FMDatabase databaseWithPath:databasePath];
[db open];
FMResultSet *results = [db executeQueryWithFormat:@"SELECT * FROM COVERS WHERE movie = %i", movie.movieID];
if([results next])
{
cover = [results dataForColumn:@"cover"];
}
return cover;
}
- (BOOL)saveCover:(NSData *)cover ForMovie:(Movie *)movie
{
BOOL result;
FMDatabase *db = [FMDatabase databaseWithPath:databasePath];
[db open];
result = [db executeUpdate:@"INSERT OR REPLACE INTO COVERS (movie, cover) VALUES (?,?)", movie.movieID, cover];
return result;
}
感谢@ccgus 的回答。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)