2012-05-31 8 views
0

На данный момент я довольно расстроен, но я уверен, что это то, что мне не хватает. В этом коде мой segue для моего нового viewController появляется после выполнения остальной функции. Как заставить мой viewController быть исполняемым кодом? В основном остановите функцию tweetText, пока она не закрыта. Я пытаюсь дать пользователю возможность выбрать учетную запись Twitter, если ее несколько. Я пробовал много разных способов. В собственном примере кода Apple они предлагают предоставить пользователю опцию, но ничего не дают о том, как это сделать, не пропуская остальную часть кода.iOS: Grand Central Dispatch and ViewControllers

Вот код:

[accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) { 

     if(granted) { 
      dispatch_sync(dispatch_get_main_queue(), ^{ 
       // Get the list of Twitter accounts. 
       self.accountsArray = [accountStore accountsWithAccountType:accountType]; 

       if([self.accountsArray count] > 1 /* Check method to see if preference is still a valid account */) { 
        // Display user accounts if no preference has been set 
        [self performSegueWithIdentifier:@"TwitterAccounts" sender:self.accountsArray]; 

        [tweet tweetText:tweetString account:self.twitterAccount type:AchievementTweet]; 

       } else { 
        [tweet tweetText:tweetString account:[self.accountsArray lastObject] type:AchievementTweet]; 
       } 
      }); 

     } else { 
      [tweet performSelectorOnMainThread:@selector(displayText:) withObject:[NSNumber numberWithInt:403] waitUntilDone:NO]; 
     } 
     }]; 
+0

Почему вы не используете делегата? –

+0

dispatch_sync (dispatch_get_main_queue() неверно, вы никогда не должны отправлять синхронным способом, используя основную очередь, так как это приведет к зависанию вашего приложения. – Pochi

+0

Извините, но я думаю, что вы ошибаетесь в этом случае, этот код не замерзает, потому что по словам apple, эта функция уже использует gcd. Кажется, что она работает в другом потоке, и это проблема, с которой я сталкиваюсь. Я не могу заставить учетные записи возвращаться и показывать пользователю, чтобы выбрать. другие методы завершены. – Michael

ответ

1

Я немного запутался о том, что ваша цель, но у вас есть 2 варианта.

Здесь нет необходимости в GCD.

Я бы предложил зарегистрироваться для уведомления, которое выполнит ваше второе действие после того, как ваше первое действие будет выполнено. (Подобно тому, как яблоко обрабатывает подборщик изображений, на их коде они сообщают, когда изображение, наконец, было сохранено для выполнения другой функции).

Другим способом является использование делегатов. При таком подходе вы должны поместить вторую часть кода в отдельную функцию, а затем объявить этот контроллер как делегата диспетчера представлений, который вы хотите выполнить первым, а затем после того, что вы хотите выполнить сделанный в viewcontroller, вы попросите делегата выполнить второй код и при необходимости попросите делегата закрыть представление.

+0

Gcd уже используется этой функцией в соответствии с видеороликами apples wwdc 2011. Поэтому уведомления и делегаты были проблемой. – Michael

+0

Спасибо, что указали мне в правильном направлении. Сначала выведите GCD и блоки. лучше понять, что происходит с кодом. Я понимаю, что делегат или уведомление будут билетом в этом случае, так как мне нужно ждать f или блок для завершения, тогда я называю то, что мне нужно, в случае более чем одной учетной записи. Немного смущает между видео и примером кода WWDC, но теперь я получаю его. dispatch_sync (dispatch_get_main_queue(),^{делает интерфейс намного быстрее, когда код завершен в этом случае. – Michael

Смежные вопросы