2012-08-07 70 views
1

我有一個UIViewController其中UITableView在其中。我在上面添加一個UIView作爲子視圖。當我在子視圖上按下UIButton之一時,會有明顯的滯後。我如何讓它更快?IBAction時滯按鈕按

見視頻:http://www.youtube.com/watch?v=KWy6NrZUeqA&feature=youtu.be

- (IBAction)tweetThat:(id)sender { 
    [MBProgressHUD showHUDAddedTo:self.socialMediaView animated:YES]; 

    dispatch_queue_t queueOne=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_sync(queueOne, ^{ 
     NSString *[email protected]"BLABLABLATweet"; 

     if ([TWTweetComposeViewController canSendTweet]) 
     { 
      TWTweetComposeViewController *tweetSheet = 
      [[TWTweetComposeViewController alloc] init]; 
      [tweetSheet setInitialText:tweetBody]; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [MBProgressHUD hideHUDForView:self.controllerView animated:YES]; 
       [self presentModalViewController:tweetSheet animated:YES]; 
      }); 
     } 
     }); 
} 

回答

0

將您的dispatch_sync更改爲dispatch_async。如果您要鎖定用戶界面直到它返回,那麼調度到後臺會有什麼意義。

0

滯後是從TWTweetComposeViewController。沒有什麼可以做的,因爲它是一個系統優化。你可能會注意到第二次和第三次你點擊按鈕的時間過去了。

+0

是的,我注意到它會在下一次加速。但爲什麼MBProgressHUD也會延遲? MBProgressHUD是在主線程上調用的第一件事,而TWTweetComposeViewController是在後臺線程上分配和初始化的。另外,「系統優化」是什麼意思? – 2012-08-07 16:07:47

+0

我不確定。我自己並沒有用'dispatch_queue'做很多事情,當我這樣做時,我通常使用'performSelectorOnBackgroundThread'作爲一個集合,並且忘記了一種方法。至於系統優化,我說什麼滯後是因爲TWTweetComposeViewController我不認爲你可以修復它。蘋果必須。 – 2012-08-07 16:14:47

1

我已經使用了上面嘗試過的調度方法,但只做了一些更改。它確實使體驗變得更好。 「loadingView」與named一樣,只是在tweet視圖出現之前顯示的加載視圖。

loadingView.hidden = NO; 
    [loadingView setNeedsDisplay]; 
    if ([TWTweetComposeViewController canSendTweet]) 
    { 
     double delayInSeconds = 0.5; 
     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
      TWTweetComposeViewController *tweet = [[TWTweetComposeViewController alloc]init]; 
      [tweet setInitialText:@"I'm using a new app called TickTalk to help my speaking cadence. Check it out!"]; 
      [tweet addURL:[NSURL URLWithString:@"http://www.ticktalkapp.com"]]; 
      TWTweetComposeViewControllerCompletionHandler 
      completionHandler = 
      ^(TWTweetComposeViewControllerResult result) { 
       switch (result) 
       { 
        case TWTweetComposeViewControllerResultCancelled: 
         NSLog(@"Twitter Result: canceled"); 
         break; 
        case TWTweetComposeViewControllerResultDone: 
         NSLog(@"Twitter Result: sent"); 
         break; 
        default: 
         NSLog(@"Twitter Result: default"); 
         break; 
       } 
       loadingView.hidden = YES; 
       [self dismissModalViewControllerAnimated:YES]; 
      }; 
      [tweet setCompletionHandler:completionHandler]; 
      [self presentModalViewController:tweet animated:YES]; 
     }); 
    } 
    else 
    { 
     UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Sorry" message:@"Your device is not setup to tweet" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 
     loadingView.hidden = YES; 
    }