我的iOS应用程序在运行应用程序时会丢失所有动画效果
我有一个基于navigationController的应用程序,它在documents目录文件夹[NSSearchPathForDirectoriesIndomainsDocumentDirectory,NSUserDomainMask,YES objectAtIndex:0]中存储了许多图像。我还使用sqlite.db在本地存储图像。我的图像存储过程如下: 我的web服务返回imagesurl路径的数组 我将url图像转换为数据,并将转换后的图像数据存储到documents目录文件夹 图像路径也保存在我的sqlite数据库中 我的问题是,当我将多个图像插入“文档”文件夹时,所有动画效果都会停止或丢失。另一个问题是将图像url保存到数据。数据是一个耗时的过程,我的视图有时会冻结。如何解决这个问题?请通过下面的代码 >我的iOS应用程序在运行应用程序时会丢失所有动画效果,ios,iphone,xcode,sqlite,nsdocumentdirectory,Ios,Iphone,Xcode,Sqlite,Nsdocumentdirectory,我有一个基于navigationController的应用程序,它在documents目录文件夹[NSSearchPathForDirectoriesIndomainsDocumentDirectory,NSUserDomainMask,YES objectAtIndex:0]中存储了许多图像。我还使用sqlite.db在本地存储图像。我的图像存储过程如下: 我的web服务返回imagesurl路径的数组 我将url图像转换为数据,并将转换后的图像数据存储到documents目录文件夹 图像路径
这是一些错误的格式。请正确设置格式以提高可读性。@n00bProgrammer,您能检查我的代码吗?您的帖子中有多个问题。首先,NSData转换非常耗时,应该转移到另一个线程。其次,在大多数情况下,动画问题是由于您试图从主线程以外的线程执行UI更改。请阅读和。我建议您使用异步加载和保存图像。它为你做了大部分工作。您只需要将图像的URL保存在本地存储中,并请求SDWebImage为您获取图像。下载后,它会自动为您缓存图像。非常简单。@n00bProgrammer,谢谢。如何在另一个线程上应用nsdata转换?你能用我上面的代码举例吗?
//My viewController class
NSString * documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSMutableArray * mMsgArray = [[NSMutableArray alloc]init];
for (int i=0; i<[imageArray count]; i++)
{
Messages *msg = [[Messages alloc]init];
NSSting *imgeUrlPath = [[imageArray objectAtIndex:i]objectForKey:@“imgPath”]];
NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[imageArray objectAtIndex:i]objectForKey:@“imgPath”]]];
msg.msgLocalPath = [self saveImage:data withFileName:[self getCurrentDateTimeAsNSString] ofType:@"png" inDirectory:documentsDirectoryPath];
[mMsgArray addObject:msg];
}
BOOL msgsuccess = NO;
msgsuccess = [[DataBaseManager getInstance]saveMessage:mMsgArray];
if (msgsuccess == NO) {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Message insertion failed" message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
//getting different imageName
-(NSString*)getCurrentDateTimeAsNSString
{
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"yyyyMMddHHmmss"];
NSDate *now = [NSDate date];
NSString *retStr = [format stringFromDate:now];
return retStr;
}
//Saving image to documents path
-(NSString*)saveImage:(NSData *)dataImage withFileName:(NSString *)imageName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath {
if ([[extension lowercaseString] isEqualToString:@"png"]) {
NSString *localImgpath = [directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"png"]];
[dataImage writeToFile:localImgpath atomically:YES];
return localImgpath;
} else if ([[extension lowercaseString] isEqualToString:@"jpg"] || [[extension lowercaseString] isEqualToString:@"jpeg"]) {
[dataImage writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"jpg"]] options:NSAtomicWrite error:nil];
} else {
NSLog(@"Image Save Failed\nExtension: (%@) is not recognized, use (PNG/JPG)", extension);
}
return nil;
}
//DataBaseManager Class(Insert message local path to sqlite db)
-(BOOL)saveMessage:(NSMutableArray*)MsgArray;
{
BOOL insertSuccess=NO;
const char *dbpath = [_databasePath UTF8String];//14
sqlite3_stmt *mstatement;
if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
for (int i=0;i<[MsgArray count];i++)
{
Messages *Msg = [MsgArray objectAtIndex:i];
NSString *insertSQL = [NSString stringWithFormat:@"insert into MESSAGES(msg_local_path) VALUES(\"%@\")",Msg.msgLocalPath];
const char *insert_stmt = [insertSQL UTF8String];
if (sqlite3_prepare_v2(database, insert_stmt,-1, &mstatement, NULL)!= SQLITE_OK){
insertSuccess = NO;
}
else
{
//Add a statement parameter to a query.
if (sqlite3_step(mstatement) == SQLITE_DONE)
{
NSLog(@"SQLITE_DONE");
// sqlite3_reset(mstatement);
insertSuccess = YES;
}
else
{
NSLog(@"SQLITE_FAIL");
NSLog(@"Insert failed: %s", sqlite3_errmsg(database));
sqlite3_reset(mstatement);
insertSuccess = NO;
}
}
}
sqlite3_close(database);
}
else{
insertSuccess = NO;
}
return insertSuccess;
}