等待异步请求,然后再执行其他代码

问题描述

我正在使用[NSURLSession sharedSession] dataTaskWithRequest从Web服务器获取数据并将其显示标签中,并根据它设置按钮图像 但是我的问题是,首先执行了标签代码,它们显示为空,然后异步块代码完成了。

if(![self connected])
   {
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    arrMyres = [[NSMutableArray alloc] initWithArray:[prefs objectForKey:@"Myres"]];
   }

   else
   {

    // POSTrequest with URL to get data from server
    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:
                             ^(NSData * _Nullable responseData,NSURLResponse * _Nullable urlResponse,NSError * _Nullable error) {
     if (error) {
        //display error
                }
             else
                {
                     NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)urlResponse;
                    if([httpResponse statusCode ]>=200 && [httpResponse statusCode]<300)
                     {
                       dispatch_async(dispatch_get_main_queue(),^{
                       NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
                              
                    NSArray *array=[[dataDictionary objectForKey:@"GetExistingFavorites"] isKindOfClass:[NSNull class]]? nil:[dataDictionary objectForKey:@"GetExistingFavorites"];
                              
                     arrMyres=[[NSMutableArray alloc]initWithArray:array];
                       });
                    }
                }

           }] resume];
        }

//This block of code executes first and displays empty label
   if([arrMyres count]>0 )
   {
    //Set Button Image and display label 
   }
   else
   { 
    // Do something else
    } 

如何等待异步请求完成执行并在之后的某个地方使用它的结果?在研究过程中,我发现了有关调度组和完成处理程序的信息。但不知道如何实现

任何建议都会有所帮助。

解决方法

使用主线程在异步代码内部更新firstLabel UI代码。请参考下面的代码

if(![self connected])
{
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    arrMyres = [[NSMutableArray alloc] initWithArray:[prefs objectForKey:@"Myres"]];
    [self updateUI];
}
else
{
    // POSTrequest with URL to get data from server
    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:
    ^(NSData * _Nullable responseData,NSURLResponse * _Nullable urlResponse,NSError * _Nullable error) {
    if (error) {
    //Display error
    }
    else
    {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)urlResponse;
        if([httpResponse statusCode ]>=200 && [httpResponse statusCode]<300)
        {
            dispatch_async(dispatch_get_main_queue(),^{
            NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];

            NSArray *array=[[dataDictionary objectForKey:@"GetExistingFavorites"] isKindOfClass:[NSNull class]]? nil:[dataDictionary objectForKey:@"GetExistingFavorites"];

            arrMyres=[[NSMutableArray alloc]initWithArray:array];
            //This block of code executes first and displays empty label
            if([arrMyres count]>0 )
            {
                [self updateUI];
            }
        }
    }

    }] resume];
}

-(void)updateUI {
    dispatch_async(dispatch_get_main_queue(),^{
//update UI in main thread.
//Add your ui updates
    });
}