所以我有一个调用FlickR API的程序,获取URL将它们放入字典中,然后使用图像视图将它们分配到表视图中。
NSArray *photos = [self.flickr photosForUser:@"James Kinvig"];
int countAttempts = 0;
[[self.flickr photosForUser:@"James Kinvig"]count];
for (int i = 0; i < [[self.flickr photosForUser:@"James Kinvig"]count]; i++) {
for(NSDictionary *dictionary in photos) {
countAttempts++;
NSString *farmId = [dictionary objectForKey:@"farm"];
NSString *serverId = [dictionary objectForKey:@"server"];
NSString *photoId = [dictionary objectForKey:@"id"];
NSString *secret = [dictionary objectForKey:@"secret"];
self.url= [NSURL URLWithString:[NSString stringWithFormat:@"http://farm%@.staticflickr.com/%@/%@_%@.jpg", farmId, serverId, photoId, secret]];
//NSLog(@"self.url = %@", self.url);
NSLog(@"count = %d", countAttempts);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
NSData *imgData = [NSData dataWithContentsOfURL:self.url];
dispatch_sync(dispatch_get_main_queue(), ^{
UIImage *img = [UIImage imageWithData:imgData];
cell.imageView.image = img;
[cell setNeedsLayout];
});
});
}
}
return cell;
}
这是它调用的方法,photosForUser:
- (NSMutableArray *) photosForUser: (NSString *) friendUserName
{
NSString *request = [NSString stringWithFormat: @"https://api.flickr.com/services/rest/?method=flickr.people.findByUsername&username=%@", friendUserName];
NSDictionary *result = [self fetch: request];
NSString *nsid = [result valueForKeyPath: @"user.nsid"];
request = [NSString stringWithFormat: @"https://api.flickr.com/services/rest/?method=flickr.photos.search&per_page=%ld&has_geo=1&user_id=%@&extras=original_format,tags,description,geo,date_upload,owner_name,place_url", (long) self.maximumResults, nsid];
result = [self fetch: request];
return [result valueForKeyPath: @"photos.photo"];
}
获取flickr API的步骤。
发生的事情是,它被困在一个永恒的循环中。即使for语句小于计数,它仍然是永恒的循环。我有NSLog的FlickR照片计数,它= 11。
这可能与它有关,但每当我按下按钮将我带到表视图控制器时,我得到一个巨大的延迟,接近一分钟,并且没有任何计算(照片方式),因为我已完成计数++
由于
答案 0 :(得分:0)
让我理解这一点..在你的第一个代码块的最后一行,我得出结论,那就是uitableview dataSource方法,cellForRowAtIndexPath ..什么都没有意义..你在那里有一个提取,你在循环中有一个循环,即在一个imageView中设置许多图像(通过下载它们),这同时发生在所有可见单元格中。这永远不会奏效!
解决方案是: 1 - 从cellForRow中删除此方法,这不是请求图像的地方
2 - 创建另一种获取内容的方法
3 - 创建一个方法来执行循环并将图像存储在阵列上,这样您就不需要多次执行,只需要一个...
4 - 完成第3步后重新加载tableview
5 - 使用已完成的图像数组通过indexPath.row在您的单元格中设置图像..
6 - 我建议您使用图书馆进行imageCache(即https://github.com/rs/SDWebImage)
答案 1 :(得分:0)
NSArray *photos = [self.flickr photosForUser:@"James Kinvig"];
for (int i = 0; i < [[self.flickr photosForUser:@"James Kinvig"] count]; i++)
{
for (NSDictionary *dictionary in photos)
{
您有两个嵌套循环遍历同一个集合。这将O(n)操作转换为O(n ^ 2),并解释了为什么您的过程需要很长时间。
由于循环体从不使用i
,我会通过去除外循环来修复它:
NSArray *photos = [self.flickr photosForUser:@"James Kinvig"];
for (NSDictionary *dictionary in photos)
{