NSDictionary常量循环

时间:2014-05-21 14:26:42

标签: ios objective-c flickr

所以我有一个调用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。

这可能与它有关,但每当我按下按钮将我带到表视图控制器时,我得到一个巨大的延迟,接近一分钟,并且没有任何计算(照片方式),因为我已完成计数++

由于

2 个答案:

答案 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)
{