0

我正在做以下事情以从服务器加载我的图像。但问题是,当 alertview 关闭时,imageview 会在 5-7 秒后显示。

如何解决这个问题?

 - (void)showFullImage :(id) sender
   {    
   // for loading view
  self.loading_alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"LOADING",nil) message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil];
  [self.loading_alert show];
  UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithFrame: CGRectMake(125, 65, 30, 30)];
  indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;

  //indicator.center = CGPointMake(loading_alert.bounds.size.width / 2, loading_alert.bounds.size.height - 50);
  [indicator startAnimating];
  [self.loading_alert addSubview:indicator];      

  self.image_url = [self.question_set valueForKey:@"image_url"];

//--------Asyncronously fetch image----------------------------------------
  NSURL *URL = [NSURL URLWithString:image_url];
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL cachePolicy:NSURLCacheStorageAllowedInMemoryOnly
                                                   timeoutInterval:60.0];
  [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){

    NSLog(@"1",nil);
    imgView= [[UIView alloc] initWithFrame:CGRectMake(0,0,320,480) ];

     UIImage* queImage = [UIImage imageWithData:data];

UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0,42,320,420)];
iv.image = queImage;

[imgView addSubview:iv];    
[self.view addSubview:imgView];  

    //dismiss alert view on main thread
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        // dismiss alert view...
         NSLog(@"2",nil);
        [self.loading_alert dismissWithClickedButtonIndex:0 animated:YES];
    });

}];    
}

帮助将不胜感激。

4

3 回答 3

1

忘掉GCD吧,你可以传入NSURLConnection的sendAsynchronousRequest:queue:completionHandler:方法[NSOperationQueue mainQueue]的queue参数,这样你就不需要过多考虑主线程和后台线程,它会自动在后台处理调用请求,并在主线程返回数据。

以下是您的代码的外观:

NSURL *URL = [NSURL URLWithString:image_url];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL cachePolicy:NSURLCacheStorageAllowedInMemoryOnly timeoutInterval:60.0];

// request is called asynchronously and response completion handler will be called on main thread
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){

    // do your whatever work here as you do normally, because it's in main thread
    NSLog(@"1",nil);
    imgView= [[UIView alloc] initWithFrame:CGRectMake(0,0,320,480) ];

    UIImage* queImage = [UIImage imageWithData:data];

    UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0,42,320,420)];
    iv.image = queImage;

    [imgView addSubview:iv];
    [self.view addSubview:imgView];
}
于 2015-07-01T10:10:11.553 回答
0

您需要在后台队列中下载图像并在主队列中更新 UI。

像这样使用 GCD,

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

        NSURL *URL = [NSURL URLWithString:image_url];
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL cachePolicy:NSURLCacheStorageAllowedInMemoryOnly
                                                   timeoutInterval:60.0];
  [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){

    NSLog(@"1",nil);


     UIImage* queImage = [UIImage imageWithData:data];

            dispatch_async(dispatch_get_main_queue(), ^{

                imgView= [[UIView alloc] initWithFrame:CGRectMake(0,0,320,480) ];
                if([receivedView isKindOfClass:[UIImageView class]])
                {
UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0,42,320,420)];
iv.image = queImage;

[imgView addSubview:iv];    
[self.view addSubview:imgView];  
                }
 // dismiss alert view...
         NSLog(@"2",nil);
        [self.loading_alert dismissWithClickedButtonIndex:0 animated:YES];

            });


        }


    });
于 2013-09-30T12:25:00.297 回答
0

SDWebmage -> 这是一个不错的第三方图片加载库。

于 2013-09-30T13:26:46.313 回答