我有一个应用程序,当你第一次打开它,主视图获取所有的朋友和他们的个人资料图片和加载UITableView
与朋友的名字,用户名和个人资料图片每个单元格。问题是,UITableView
需要更长的时间来加载所有的朋友,如果你有很多朋友,例如大约30(大约需要5-8秒)。我将所有这些图像存储在与朋友的用户名相关联的字典中,以便稍后重复使用它们,但主要问题是应用程序第一次启动时要加载所有图像需要多长时间。这是我对现在的代码,做它在遍历每个朋友:iOS - 更快速的方式加载UIImages从URL的
[auth.loggedInUser getFriendsSuccessCallback:^(NSArray* friends){
for (User* friend in friends) {
if (![weakSelf.friendImageDictionary.allKeys containsObject:friend.userName])
{
UIImage *profilePicture;
if (!friend.profilePicture) {
profilePicture = [UIImage imageNamed:@"ProfilePic"];
}
else
{
NSURL *profilePictureURL = [NSURL URLWithString:friend.profilePicture];
NSData * profilePictureData = [NSData dataWithContentsOfURL:profilePictureURL];
profilePicture = [UIImage imageWithData:profilePictureData];
}
if (profilePicture == nil)
{
profilePicture = [UIImage imageNamed:@"ProfilePic"];
}
[weakSelf.friendImageDictionary setObject:profilePicture forKey:friend.userName];
}
}
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf.tableView reloadData];
});
}
如何显著减少所花费的时间来加载所有这些图像的数量有什么建议?
进展情况:
好了,所以我使用AFNetworking
用下面的代码:
[auth.loggedInUser getFriendsSuccessCallback:^(NSArray* friends){
NSMutableArray *profilePictureRequests = [[NSMutableArray alloc] init];
for (User* friend in friends) {
if (![weakSelf.friendImageDictionary.allKeys containsObject:friend.userName])
{
if (!friend.profilePicture) {
UIImage *profilePicture = [UIImage imageNamed:@"ProfilePic"];
[weakSelf.friendImageDictionary setObject:profilePicture forKey:friend.userName];
}
else
{
NSURL *profilePictureURL = [NSURL URLWithString:friend.profilePicture];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:profilePictureURL];
AFHTTPRequestOperation *requestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest];
requestOperation.responseSerializer = [AFImageResponseSerializer serializer];
[requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, UIImage* profilePicture) {
NSLog(@"Response: %@", profilePicture);
if (profilePicture == nil)
{
profilePicture = [UIImage imageNamed:@"ProfilePic"];
}
[weakSelf.friendImageDictionary setObject:profilePicture forKey:friend.userName];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Image error: %@", error);
}];
[profilePictureRequests addObject:requestOperation];
}
}
}
for (AFHTTPRequestOperation *requestOperation in profilePictureRequests)
{
[requestOperation start];
}
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf.tableView reloadData];
weakSelf.dashboardViewController.loadingCoverView.hidden = YES;
[weakSelf.dashboardViewController.tableActivityIndicator stopAnimating];
NSLog(@"FINISHED LOADING ALL PROFILE PICTURES");
});
}
基本上我所做的就是保存在某个NSMutableArray
的AFHTTPRequestOperation
对于需要加载每个图像。之后,我重复了NSMutableArray
并开始每个AFHTTPRequestOperation
。
问题:
这只是做加载所有图像非常快,但我想我错误地做这件事。我的加载视图与我的活动指示器完成并消失之前,所有图像完成下载并添加到我的NSMutableDictionary
当它应该发生后,所有的下载和添加。有没有办法让我的加载视图和活动指示器消失所有UIImage
下载后台线程完成后?
另一个问题关于AFNetworking
:
是我做的方式(使约30个图像下载后台线程在这种情况下,在同一时间发生)不是好的做法与AFNetworking
?如果一个用户拥有超过100个朋友,并且同时发生超过100个图像下载后台线程,它会导致未来的问题吗?
听起来像是你应该减少图像服务器端的大小。 – vikingosegundo
这已完成,并且大量图像的加载时间仍然是个问题,特别是当用户拥有更多朋友时。我认为在设置一个新的后台线程的范围内,必须从url加载每个图像。这可能吗? – Rafi
使用AFNetworking和异步下载非常容易 – james