ProgressHUD异步请求的问题

时间:2014-03-23 19:47:48

标签: ios iphone objective-c asynchronous

我正在尝试在异步请求中进行HUD,但它似乎无法正常工作。我想要的是在异步请求完成之前显示progessHUD。目前它没有在开头显示,但是在3秒之后显示0.1秒或者其他东西,然后完成异步请求。我做错了什么,为了实现在viewisloaded到异步请求完成后显示progessHUD?

如下所示,我在viewDidLoad和firstRequest方法中添加了progressHUD show和dismiss。

viewDidLoad中:

- (void)viewDidLoad
{
[super viewDidLoad];
[ProgressHUD show:@"Please Wait..."];
buttonLogin = [[UIBarButtonItem alloc] initWithTitle:@"Login" style:UIBarButtonItemStyleBordered target:self action:@selector(actionLogin)];
buttonLogout = [[UIBarButtonItem alloc] initWithTitle:@"Logout" style:UIBarButtonItemStyleBordered target:self action:@selector(actionLogout)];

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;
self.theTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight-160) style:UITableViewStylePlain];
self.theTableView.dataSource = self;
self.theTableView.delegate = self;
[self.view addSubview:self.theTableView];

self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor]};

fixtures = [[NSMutableArray alloc] init];
sections = [[NSMutableArray alloc] init];
sortedArray = [[NSMutableArray alloc] init];



[self firstRequest];

self.bannerView = [[GADBannerView alloc] initWithFrame:CGRectMake(0.0, self.view.frame.size.height-100, GAD_SIZE_320x50.width, GAD_SIZE_320x50.height)];

self.theTableView.backgroundColor = [UIColor colorWithRed:243/255.0f green:243/255.0f blue:247/255.0f alpha:1.0f];
    self.view.backgroundColor = [UIColor colorWithRed:243/255.0f green:243/255.0f blue:247/255.0f alpha:1.0f];

[self checkAuthStatus];

[ProgressHUD dismiss];


}

请求:

-(void)firstRequest
{



NSURL *url = [NSURL URLWithString:@"URL"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response,
                                           NSData *data, NSError *connectionError)
 {

     [ProgressHUD show:@"Please Wait..."];

         jsonResult = [NSJSONSerialization JSONObjectWithData:data
                                                                  options:0
                                                                    error:NULL];



         int subObjects = ((NSArray *)jsonResult[@"match"]).count;
         for (int i = 0; i <= subObjects-1; i++) {

             NSString *date = [NSString stringWithFormat:@"%@ %@",[[[jsonResult valueForKey:@"match"] valueForKey:@"playdate"] objectAtIndex:i], [[[jsonResult valueForKey:@"match"] valueForKey:@"time"] objectAtIndex:i]];
             NSString *identifier = [[NSLocale currentLocale] localeIdentifier];

             NSDateFormatter *df = [[NSDateFormatter alloc] init];
             [df setTimeZone: [NSTimeZone timeZoneWithName:@"US/Arizona"]];
             [df setLocale:[NSLocale localeWithLocaleIdentifier:identifier]];
             [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

             NSDate *myDate = [df dateFromString:[NSString stringWithFormat:@"%@", date]];





             NSArray *items = [[NSString stringWithFormat:@"%@", myDate] componentsSeparatedByString:@" "];


             NSString *home = [[[jsonResult valueForKey:@"match"] valueForKey:@"hometeam"] objectAtIndex:i];
             NSString *away = [[[jsonResult valueForKey:@"match"] valueForKey:@"awayteam"] objectAtIndex:i];
             NSString *league = [[[jsonResult valueForKey:@"match"] valueForKey:@"league"] objectAtIndex:i];




             [fixtures addObject:
              [[NSMutableDictionary alloc] initWithObjectsAndKeys:
               items[0], @"date",
               items[1], @"time",
               home, @"home",
               away, @"away",
               league, @"league",
               nil]];

             [sections addObject:
              [[NSMutableDictionary alloc] initWithObjectsAndKeys:
               items[0], @"date",
               nil]];


         }



     NSArray *copy = [sections copy];
     NSInteger index = [copy count] - 1;
     for (id object in [copy reverseObjectEnumerator]) {
         if ([sections indexOfObject: object inRange: NSMakeRange(0, index)] != NSNotFound) {
             [sections removeObjectAtIndex: index];
         }

         index--;
     }



     NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO];
     NSArray *descriptors = [NSArray arrayWithObject: descriptor];
     NSArray* reverseTheArray = [[sections valueForKey:@"date"] sortedArrayUsingDescriptors:descriptors];
     reversedArray = [[reverseTheArray reverseObjectEnumerator] allObjects];

     [self.theTableView reloadData];


     [ProgressHUD dismiss];
     }




 ];



}

1 个答案:

答案 0 :(得分:0)

您应该在发送请求之前显示ProgressHUD

您的代码应如下所示。

-(void)firstRequest
{
   [ProgressHUD show:@"Please Wait..."];

   NSURL *url = [NSURL URLWithString:@"URL"];
   NSURLRequest *request = [NSURLRequest requestWithURL:url];
   [NSURLConnection sendAsynchronousRequest:request
     queue:[NSOperationQueue mainQueue]
     completionHandler:^(NSURLResponse *response,
         NSData *data, NSError *connectionError)
     {
       // request processing stuff
       ...
       [ProgressHUD dismiss];
     }
];

<强>解释即可。当您调用sendAsynchronousRequest...时,请求本身在后台线程中的某处执行。网络操作可能需要一些时间,1-5-10秒。您的completionHandler将在请求完成后执行(延迟后)。因此,您应该在发送请求之前显示ProgressHUD 。然后启动请求。并且在处理完所有内容后,在ProgressHUD块的结尾中解除completionHandler


<强>更新 我在代码中注意到了另外一个问题。在视图加载时,viewDidLoad方法仅在视图控制器上被调用一次,但此时视图本身不会显示在屏幕上。因此,您实际上不会看到ProgressHUD来自viewDidLoad。如果您想要在屏幕上显示视图时处理,您可能会对viewWillAppearviewDidAppear方法感兴趣。


我假设您的视图控制器旨在显示从web api检索的数据。我认为最好的选择是在viewWillAppear打电话给你的api。

- (void)viewDidLoad
{
    [super viewDidLoad];
    buttonLogin = [[UIBarButtonItem alloc] initWithTitle:@"Login" style:UIBarButtonItemStyleBordered target:self action:@selector(actionLogin)];
    buttonLogout = [[UIBarButtonItem alloc] initWithTitle:@"Logout" style:UIBarButtonItemStyleBordered target:self action:@selector(actionLogout)];

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenWidth = screenRect.size.width;
    CGFloat screenHeight = screenRect.size.height;
    self.theTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight-160) style:UITableViewStylePlain];
    self.theTableView.dataSource = self;
    self.theTableView.delegate = self;
    [self.view addSubview:self.theTableView];

    self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
    self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor]};

    fixtures = [[NSMutableArray alloc] init];
    sections = [[NSMutableArray alloc] init];
    sortedArray = [[NSMutableArray alloc] init];

    self.bannerView = [[GADBannerView alloc] initWithFrame:CGRectMake(0.0, self.view.frame.size.height-100, GAD_SIZE_320x50.width, GAD_SIZE_320x50.height)];

    self.theTableView.backgroundColor = [UIColor colorWithRed:243/255.0f green:243/255.0f blue:247/255.0f alpha:1.0f];
    self.view.backgroundColor = [UIColor colorWithRed:243/255.0f green:243/255.0f blue:247/255.0f alpha:1.0f];

    [self checkAuthStatus];
}

- (void)viewWillAppear:(BOOL)animated


{
    [super viewWillAppear:animated];
    [self firstRequest];
}

-(void)firstRequest
{
    [ProgressHUD show:@"Please Wait..."];

    NSURL *url = [NSURL URLWithString:@"URL"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response,
                                               NSData *data, NSError *connectionError)
     {
         // request processing stuff
         ...
         [ProgressHUD dismiss];
     }
     ];
}