0

我有一种从服务器下载一些图片的方法。我使用异步块(NSMutableArray *imgtmp)定义了下载数据的缓冲区,但还没有弄清楚如何从那里取出数组。访问 imgtmp 以返回其内容或从中设置实例变量的最佳方法是什么?

我一直在查看Apple Block 文档,但我一定不在正确的部分。我需要以某种方式使用__block关键字声明 imgtmp 吗?我试过了,但 imgtmp 在块外仍然是空的。谢谢!

编辑:使用工作模型更新代码

- (void) loadImages
{
   // temp array for downloaded images. If all downloads complete, load into the actual image data array for tablerows
   __block NSMutableArray *imgtmp = [[NSMutableArray alloc] init];

   dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0),
   ^{
      int error = 0;
      int totalitems = 0;
      NSMutableArray *picbuf = [[NSMutableArray alloc] init];

      for (int i=0; i < _imageURLS.count;i++)
      {
         NSLog(@"loading image for main image holder at index %i",i);
         NSURL *mynsurl = [[NSURL alloc] initWithString:[_imageURLS objectAtIndex:i]];
         NSData *imgData = [NSData dataWithContentsOfURL:mynsurl];
         UIImage *img = [UIImage imageWithData:imgData];


         if (img)
         {
            [picbuf addObject:img];
            totalitems++;
         }
         else
         {
            NSLog(@"error loading img from %@", [_imageURLS objectAtIndex:i]);
            error++;
         }
      }// for int i...


      dispatch_async(dispatch_get_main_queue(),
      ^{
         NSLog(@"_loadedImages download COMPLETE");
         imgtmp = picbuf;
         [_tvStatus setText: [NSString stringWithFormat:@"%d objects have been retrieved", totalitems]];
         NSLog (@"imgtmp contains %u images", [imgtmp count]);
      });// get_main_queue


   });// get_global_queue


}
4

1 回答 1

1

在执行任何块代码之前,您正在执行“最终”NSLog调用。您所有的图像加载内容都包含在 dispatch_async 中。它是异步执行的,而 NSLog 会立即被调用。

我认为对你来说最好的办法是将 imgtmp 传递给一些持久对象。也许您的视图控制器可以具有如下属性:

@property (nonatomic, copy) NSArray *images;

并且您可以在将文本分配给的同一块中分配它_tvStatus

于 2013-09-20T17:23:23.950 回答