2013-01-03 64 views
2

從塊中顯示UIAlertView的最佳方式是什麼?如何從iOS上的塊顯示UIAlertView?

我已經在我的代碼如下動作:

- (IBAction)connectWithTwitterClicked:(id)sender { 
    ACAccountStore * account = [[ACAccountStore alloc]init]; 
    ACAccountType * accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; 

    [account requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) { 
     if (granted == YES){ 
      NSLog(@"Twitter account has been granted"); 
      NSArray * arrayOfAccounts = [account accountsWithAccountType:accountType]; 
      if([arrayOfAccounts count] > 0){ 
       ACAccount * twitterAccount = [arrayOfAccounts lastObject]; 
       NSLog(@"Found twitter Id of [%@]", twitterAccount.username); 
       // continue on to use the twitter Id 
      } else { 
       // no twitter accounts found, display alert to notify user 
      } 
     } else{ 
      NSLog(@"No twitter accounts have been granted"); 
      // no twitter accounts found, display alert to notify user 
     } 
    }]; 
} 

我試過到目前爲止這些解決方案:

  1. 在任一2個註釋行,直接創建和顯示 UIAlertView中,這使應用程序崩潰,我相信這是由於 該塊是異步進程,並且無法訪問UI線程來顯示警報
  2. 在塊外部創建了一個NSMutableString,並將其標記爲 __block,將其設置在註釋行中,然後顯示。 類似的問題在這裏塊是異步運行,所以在 顯示警報的時間theres不能保證 NSMutableString已被設置。

任何人都可以提出解決方案嗎?我希望能夠以某種方式通知用戶,以便他們既可以不使用Twitter,也可以在設備設置中關閉並設置帳戶。

由於

回答

8

創建,顯示警報視圖,然後在主線程上執行其選擇的方法:

- (void)showAlertWithTitle:(NSString *)t 
{ 
    [[[[UIAlertView alloc] initWithTitle:t 
           message:nil 
           delegate:nil 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil 
    ] autorelease] show]; 
} 

稱之爲如下:

[SomeClass dispatchNastyAsyncBlock:^{ 
    // ... do stuff, then 
    [self performSelectorOnMainThread:@selector(showAlertWithTitle:) 
          withObject:@"Here comes the title" 
         waitUntilDone:YES]; 
}]; 
+3

如果您使用ARC,請務必刪除「autorelease」調用。 – lxt

+1

腦死亡多餘的不義之舉的任何原因downvote? – 2013-01-03 20:22:56

11

這是GCD方法:

[SomeClass dispatchNastyAsyncBlock:^{ 
    // ... do stuff, then 
    dispatch_async(dispatch_get_main_queue(),^{ 
     [[[[UIAlertView alloc] initWithTitle:t 
            message:nil 
            delegate:nil 
          cancelButtonTitle:@"OK" 
          otherButtonTitles:nil 
     ] autorelease] show]; 
    }); 
}];