Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 检测分派异步方法是否仍在运行_Iphone_Ios_Objective C_Cocoa Touch_Grand Central Dispatch - Fatal编程技术网

Iphone 检测分派异步方法是否仍在运行

Iphone 检测分派异步方法是否仍在运行,iphone,ios,objective-c,cocoa-touch,grand-central-dispatch,Iphone,Ios,Objective C,Cocoa Touch,Grand Central Dispatch,我有一个loadImages方法 单击按钮后,视图进入屏幕,并显示当前存在于_storedImages中的所有图像 - (void)displayImages { for (NSString *link in _storedImages) { //displayImages } } 此设置的问题是,如果用户在加载所有图像之前单击按钮,屏幕上不会显示所有图像 因此,如果单击按钮,并且loadImages dispatch\u async方法仍在运行,我希望显示一个SVPr

我有一个loadImages方法

单击按钮后,视图进入屏幕,并显示当前存在于_storedImages中的所有图像

- (void)displayImages {
   for (NSString *link in _storedImages) {
      //displayImages
   }
}
此设置的问题是,如果用户在加载所有图像之前单击按钮,屏幕上不会显示所有图像

因此,如果单击按钮,并且loadImages dispatch\u async方法仍在运行,我希望显示一个SVProgressHUD

那么,我如何跟踪此分派\u async何时完成?因为如果我知道这一点,那么我可以显示一个SVProgressHUD,直到它完成

另一方面,如果您知道如何动态加载/显示图像,则该信息也会有所帮助,即单击按钮,然后在看到当前图像时,会下载并显示更多图像

- (void)displayImages {
   for (NSString *link in _storedImages) {
      //displayImages
   }
}
感谢第一次使用iOS的开发者

好的,我找到了一个解决方案,但它的效率非常低,我相信有更好的方法可以做到这一点


对于这类问题,我通常做的基本上是以下草图:

- (void)downloadImages:(NSArray*)arrayOfImages{

  if([arrayOfImages count] != 0)
  {
     NSString *urlForImage = [arrayOfImages objectAtIndex:0];
     // Start downloading the image

     // Image has been downloaded
     arrayOfImages = [arrayOfImages removeObjectAtIndex:0];
     // Ok let's get the next ones...
     [self downloadImages:arrayOfImages];
  }
  else
  {
   // Download is complete, use your images..
  }
}

您可以传递失败的下载次数,甚至可以传递将在下载后接收图像的代理

对于这类问题,我通常做的基本上是以下的粗略描述:

- (void)downloadImages:(NSArray*)arrayOfImages{

  if([arrayOfImages count] != 0)
  {
     NSString *urlForImage = [arrayOfImages objectAtIndex:0];
     // Start downloading the image

     // Image has been downloaded
     arrayOfImages = [arrayOfImages removeObjectAtIndex:0];
     // Ok let's get the next ones...
     [self downloadImages:arrayOfImages];
  }
  else
  {
   // Download is complete, use your images..
  }
}
您可以传递失败的下载次数,甚至可以传递将在下载后接收图像的代理

请记住,NSMutableArray不是线程安全的。您必须确保不要试图同时从两个线程访问它

使用布尔值跟踪是否仍在加载图像是可以的。使loadImages如下所示:

- (void)loadImages {
    self.doneLoadingImages = NO;

    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        while (1) {
            UIImage *image = [self bg_getNextImage];
            if (!image)
                break;
            dispatch_async(dispatch_get_main_queue(), ^{
                [self addImage:image];
            });
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            [self didFinishLoadingImages];
        });

    });
}
因此,我们在每个图像的主队列上发送addImage:。addImage:方法将仅在主线程上调用,因此它可以安全地访问StoredImage:

加载完所有图像后,我们会发送didFinishLoadingImages。在这里,我们可以更新doneLoadingImages标志,并在必要时隐藏进度HUD:

- (void)didFinishLoadingImages {
    self.doneLoadingImages = YES;
    if (storedImagesViewIsVisible) {
        [self hideProgressHUD];
    }
}
然后,您的按钮操作可以检查doneLoadingImages属性:

- (IBAction)displayImagesButtonWasTapped:(id)sender {
    if (!storedImagesViewIsVisible) {
        [self showStoredImagesView];
        if (!self.doneLoadingImages) {
            [self showProgressHUD];
        }
    }
}
请记住,NSMutableArray不是线程安全的。您必须确保不要试图同时从两个线程访问它

使用布尔值跟踪是否仍在加载图像是可以的。使loadImages如下所示:

- (void)loadImages {
    self.doneLoadingImages = NO;

    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        while (1) {
            UIImage *image = [self bg_getNextImage];
            if (!image)
                break;
            dispatch_async(dispatch_get_main_queue(), ^{
                [self addImage:image];
            });
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            [self didFinishLoadingImages];
        });

    });
}
因此,我们在每个图像的主队列上发送addImage:。addImage:方法将仅在主线程上调用,因此它可以安全地访问StoredImage:

加载完所有图像后,我们会发送didFinishLoadingImages。在这里,我们可以更新doneLoadingImages标志,并在必要时隐藏进度HUD:

- (void)didFinishLoadingImages {
    self.doneLoadingImages = YES;
    if (storedImagesViewIsVisible) {
        [self hideProgressHUD];
    }
}
然后,您的按钮操作可以检查doneLoadingImages属性:

- (IBAction)displayImagesButtonWasTapped:(id)sender {
    if (!storedImagesViewIsVisible) {
        [self showStoredImagesView];
        if (!self.doneLoadingImages) {
            [self showProgressHUD];
        }
    }
}

你放一个便条,这可能会有所帮助,它允许你在图像下来时显示它们,我将URL存储在一个数组中,这里是字符串,但你可以使用NSURL数组

for(NSString *urlString in imageURLs)
{
    // Add a downloading image to the array of images
    [storedImages addObject:[UIImage imageNamed:@"downloading.png"]];

    // Make a note of the image location in the array    
    __block int imageLocation = [storedImages count] - 1; 

    // Setup the request    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    [request setTimeoutInterval: 10.0];
    request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

    [NSURLConnection sendAsynchronousRequest:request
                  queue:[NSOperationQueue currentQueue]
                  completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                  // Check the result
                  NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
                  if (data != nil && error == nil && [httpResponse statusCode] == 200)
                  { 
                      storedImages[imageLocation] = [UIImage imageWithData:data];
                      [self reloadImages];
                  }
                  else
                  {
                      // There was an error
                      recommendedThumbs[imageLocation] = [UIImageimageNamed:@"noimage.png"];
                      [self reloadImages]
                  }
           }];
}
然后需要另一种方法来重新加载显示。如果图像在表中,则[[tableview]重新加载数据]

-(void)reloadImages

你放一个便条,这可能会有所帮助,它允许你在图像下来时显示它们,我将URL存储在一个数组中,这里是字符串,但你可以使用NSURL数组

for(NSString *urlString in imageURLs)
{
    // Add a downloading image to the array of images
    [storedImages addObject:[UIImage imageNamed:@"downloading.png"]];

    // Make a note of the image location in the array    
    __block int imageLocation = [storedImages count] - 1; 

    // Setup the request    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    [request setTimeoutInterval: 10.0];
    request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

    [NSURLConnection sendAsynchronousRequest:request
                  queue:[NSOperationQueue currentQueue]
                  completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                  // Check the result
                  NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
                  if (data != nil && error == nil && [httpResponse statusCode] == 200)
                  { 
                      storedImages[imageLocation] = [UIImage imageWithData:data];
                      [self reloadImages];
                  }
                  else
                  {
                      // There was an error
                      recommendedThumbs[imageLocation] = [UIImageimageNamed:@"noimage.png"];
                      [self reloadImages]
                  }
           }];
}
然后需要另一种方法来重新加载显示。如果图像在表中,则[[tableview]重新加载数据]

-(void)reloadImages

您可以在方法末尾调用函数,这是处理GCD委托的常用方法。我更好奇的是,为什么您的图像停止加载,您是否尝试过寻找其他人的异步图像视图实现?网上有很多东西,可能会有帮助。图片不会停止加载,只是不会显示。例如,如果我离开图像列表视图返回主视图,然后再次单击按钮,所有图像都在那里,只是图像列表视图永远不会更新。您可以在方法末尾调用函数,这是处理GCD委托的常用方法。我更好奇的是,为什么您的图像停止加载,您是否尝试过寻找其他人的异步图像视图实现?网上有很多东西,可能会有帮助。图片不会停止加载,只是不会显示。例如,如果我离开图像列表视图返回主视图,再次单击按钮,所有图像都在那里,只是图像列表视图从不更新,而我做什么@罗布·马约夫:这似乎是个好主意。我仍在努力让它与我的代码一起工作,一旦我让它工作起来,我会投票并打勾,直到那时,我会让任何人尝试这个问题,以防他们有任何其他想法。这是可行的,而且实际上比我将数组发送到不同方法的方法更快。以后,我将尽量不使用数组:嗨,罗布,你在这方面做得很出色,你能帮我解决一个类似的问题吗,这个问题与AFNetworking有关,非常感谢!我非常感激@抢劫-mayoff@user924有;查看NSThread的ex
执行、完成和取消属性。但调度队列并不对应于单个线程,线程的属性也不一定适用于队列。另外,请注意Thread.getState文档中的内容:“此方法设计用于监视系统状态,而不是用于同步控制。”while 1的作用是什么@罗布·马约夫:这似乎是个好主意。我仍在努力让它与我的代码一起工作,一旦我让它工作起来,我会投票并打勾,直到那时,我会让任何人尝试这个问题,以防他们有任何其他想法。这是可行的,而且实际上比我将数组发送到不同方法的方法更快。以后,我将尽量不使用数组:嗨,罗布,你在这方面做得很出色,你能帮我解决一个类似的问题吗,这个问题与AFNetworking有关,非常感谢!我非常感激@抢劫-mayoff@user924有;检查NSThread的执行、完成和取消属性。但调度队列并不对应于单个线程,线程的属性也不一定适用于队列。另外,请注意Thread.getState文档中的内容:“此方法设计用于监视系统状态,而不是用于同步控制。”