Search code examples
iosobjective-cios7ios9xcode7

This application is modifying the autolayout engine from a background thread Twitter Background Share


I trying to share the Text in Twitter. after posting text to the twitter i am getting error :This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release. What is the solution for this ?

ACAccountStore *account = [[ACAccountStore alloc] init];
    ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

    NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:[NSString stringWithFormat:@"text with link http://www.pothi.com/"],@"status",@"true",@"wrap_links", nil];
    //hear before posting u can allow user to select the account

    NSArray *arrayOfAccons = [account accountsWithAccountType:accountType];
    for(ACAccount *acc in arrayOfAccons)
    {
        NSLog(@"%@",acc.username); //in this u can get all accounts user names provide some UI for user to select,such as UITableview
    }

    [account requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error)
    {
        if (granted == YES)
        {
            // Populate array with all available Twitter accounts
            NSArray *arrayOfAccounts = [account accountsWithAccountType:accountType];
            if ([arrayOfAccounts count] > 0)
            {
                //use the first account available
                ACAccount *acct = [arrayOfAccounts objectAtIndex:0]; //hear this line replace with selected account. than post it :)
                //Build a twitter request
                SLRequest *postRequest  = [SLRequest requestForServiceType:SLServiceTypeTwitter
                                                             requestMethod:SLRequestMethodPOST
                                                                       URL:[NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/update.json"]
                                                                parameters:dict];
                //for iOS 6 use "https://api.twitter.com/1/statuses/update.json"
                //u should get the response code 200 for successful post
                [postRequest setAccount:acct];
                //manage the response
                [postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
                 {
                     if(error)
                     {
                         //if there is an error while posting the tweet
                         UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Twitter" message:@"Error in posting" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                         [alert show];
                     }
                     else
                     {
                         // on successful posting the tweet
                         NSLog(@"Twitter response, HTTP response: %li", (long)[urlResponse statusCode]);
                         UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Twitter" message:@"Successfully posted" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                         [alert show];
                     }
                 }];
            }
            else
            {
                UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Twitter" message:@"You have no twitter account" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                [alert show];
            }
        }
        else
        {
            //suppose user not set any of the accounts
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Twitter" message:@"Permission not granted" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
        }
    }];

Solution

  • Apple have started (with iOS 9) detecting when you're doing this and warning you. Before you update UI while doing other stuff in the background, wrap the UI update calls in something like

    call your all UIAlertview in main thread and check

    dispatch_async(dispatch_get_main_queue(), ^{
    // add your UIAlertview code here
    });