При удалении учетной записи Twitter из настроек происходит сбой приложения с помощью платформы iOS5 - PullRequest
0 голосов
/ 12 октября 2011

Я использую iOS 5 Twitter Framework и сохраняю объект ACAccount.Если пользователь заходит и удаляет конкретную учетную запись из настроек, приложение (очевидно) вылетает.Мой текущий обходной путь только сохраняет имя пользователя и повторно выбирает массив учетных записей Twitter и сопоставляет имена пользователей, чтобы получить правильную учетную запись.Есть ли лучшая работа вокруг.Я знаю, что есть уведомление от ACAccountStore

ACAccountStoreDidChangeNotification

, но я его не получаю.

Код ниже является исправленной версией.Здесь я сравниваю предыдущее имя пользователя учетной записи.Если я удаляю это и использую AccountObject, выбранный пользователем ранее, и если пользователь изменил эту учетную запись, приложение вылетит.

if ([TWTweetComposeViewController canSendTweet]) {

        ACAccountStore *store = [[ACAccountStore alloc] init];
        ACAccountType *twitterType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
        [store requestAccessToAccountsWithType:twitterType withCompletionHandler:^(BOOL granted, NSError *error) 
         {

             if(granted)
             {
                NSArray *arrayOfAccounts =  [store accountsWithAccountType:twitterType];
                 if (arrayOfAccounts != nil && [arrayOfAccounts count]>0) {
                     for(ACAccount *anAccount in arrayOfAccounts)
                     {
                         if ([anAccount.username isEqualToString:previousAccount.username] ) {
                             [self setPhoneTwitterAccount:anAccount]; //alwAYS SET the new Account.
                             break;
                         }
                     }
                     //previous account was deleted if a userName match was not found
                     //show the picker or just pick the first account.
                     //TODO: provide a picker from here as well.
                     if (self.phoneTwitterAccount == nil) {
                         self.phoneTwitterAccount = [arrayOfAccounts objectAtIndex:0];
                     }

                 }
             }
         }];
    }

Crashпроисходит при использовании старого аккаунта:

 TWRequest* twitterRequest_5 = [[[TWRequest alloc] initWithURL:profileURL 
                                                          parameters:parameters
                                                       requestMethod:TWRequestMethodGET]autorelease];

        [twitterRequest_5 setAccount:phoneTwitterAccount];    

        [twitterRequest_5 performRequestWithHandler:^(NSData *responseData,NSHTTPURLResponse *urlResponse, NSError *error);

1 Ответ

2 голосов
/ 07 ноября 2011

У меня была похожая проблема с ACAccounts, мое приложение зависало, и отладчик давал мне EXC_BAD_ACCESS каждый раз, когда выполнялся следующий блок:

performRequestWithHandler:^(NSData *responseData,NSHTTPURLResponse *urlResponse, NSError *error) 

Проблема была решена, когда я сохранил ACAccountStore какпеременная экземпляра в моем делегате приложения.Возможно, вы могли бы попытаться выделить и инициализировать ACAccountStore один раз в делегате приложения, а затем ссылаться на этот экземпляр каждый раз, когда вам нужно получить данные учетной записи, а не выделять и инициализировать новые экземпляры всякий раз, когда вам нужно получить данные учетной записи Twitter.

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
ACAccountStore *store = appDelegate._accountStore;

Не очень понятно, каковы отношения между ACAccountStore и ACAccount, но в документации сказано: «Каждый объект ACAccount принадлежит одному объекту ACAccountStore.».Я полагаю, это означает, что если я не сохраню экземпляр ACAccountStore, из которого получен мой экземпляр ACAccount, в какой-то момент могут возникнуть проблемы.

Дайте мне знать, если это помогает, это совершенно неправильно, или, возможно, кто-томогу объяснить, что на самом деле здесь происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...