简体   繁体   中英

How to get the twitter timeline using SLRequest

I'm trying to add Twitter timeline to my iOS app. Twitter gives the official sample code here: https://dev.twitter.com/docs/ios/making-api-requests-slrequest
My problem is: in line 70

if (timelineData) {
    NSLog(@"Timeline Response: %@\n", timelineData);
}

The timeline data is successfully printed to the console. I tried to add

self.dict = timelineDate;

and

return self.dict;

at the end of the function, but actually it returns a empty dictionary. I noticed that the process is done in another thread, so I tried

dispatch_async(dispatch_get_main_queue(), ^{
    self.dict = timelineDate;
};

but it still not work. This may be very easy to solve, but I really can't find any resources from either Apple or Twitter. Can anyone help?

I load tweets in my app using this function (compatible for twitter api v1.1 but needs twitter account to be synced in the device.) I am doing it using TWRequest you can do the same with SLRequest too.

//include twitter.framework 
#import <Twitter/Twitter.h>

+ (void)getTweetsFortwitterID:(NSString *)twitterID

{
    if(twitterID.length >0)
    {
    NSString * finalURL = [NSString stringWithFormat:@"https://api.twitter.com/1.1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=%@&count=10", twitterID];

    TWRequest *postRequest = [[TWRequest alloc] initWithURL:[NSURL URLWithString:finalURL] parameters:nil requestMethod:TWRequestMethodGET];

    ACAccountStore *accountStore = [[ACAccountStore alloc] init] ;

    ACAccountType *accountType =  [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

        // Request access from the user to use their Twitter accounts.
        [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error)
         {
             if(granted)
             {
                 NSArray *twitterAccounts = [accountStore accountsWithAccountType:accountType];

                 if([twitterAccounts count] >0
                    )
                 {
                 ACAccount *twitterAccount = [twitterAccounts objectAtIndex:0];
                 [postRequest setAccount:twitterAccount];

                 NSLog(@"request.account:%@",postRequest.account);

                 // Perform the request created above and create a handler block to handle the response.
                 NSMutableArray *tweetsArray=[[NSMutableArray alloc]init];

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

                     // Parse the responseData, which we asked to be in JSON format for this request, into an NSDictionary using NSJSONSerialization.
                     NSArray *publicTimeline = nil;
                     NSError *jsonParsingError = nil;
                     if (responseData)
                     {
                         publicTimeline = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&jsonParsingError];
                         NSLog(@"publicTimeline : %@", publicTimeline);
                     }

                     if ([publicTimeline isKindOfClass:[NSArray class]])
                     {

                         for (int i =0; i<[publicTimeline count]; i++)
                         {
                             NSMutableDictionary *twitterDict=[[NSMutableDictionary alloc]init];

                             if ([[publicTimeline objectAtIndex:i] objectForKey:@"text"])
                             {
                                 NSLog(@"ID: %@", [[publicTimeline objectAtIndex:i] objectForKey:@"text"]);
                                 [twitterDict setObject:[[publicTimeline objectAtIndex:i] objectForKey:@"text"] forKey:@"text"];
                             }
                             if ([[publicTimeline objectAtIndex:i] objectForKey:@"created_at"])
                             {
                                 NSLog(@"ID: %@", [[publicTimeline objectAtIndex:i] objectForKey:@"created_at"]);
                                 [twitterDict setObject:[[publicTimeline objectAtIndex:i] objectForKey:@"created_at"]
                                                 forKey:@"created_at"];
                             }

                             if ([[publicTimeline objectAtIndex:i] objectForKey:@"user"])
                             {
                                 NSLog(@"ID: %@", [[publicTimeline objectAtIndex:i] objectForKey:@"created_at"]);
                                 [twitterDict setObject:[[[publicTimeline objectAtIndex:i] objectForKey:@"user"]objectForKey:@"profile_image_url"]
                                                 forKey:@"profile_image_url"];
                             }


                             [tweetsArray addObject:twitterDict];
                             NSLog(@"tweets:%@", tweetsArray);

                         }
                     }

                     if([tweetsArray count]>0)
                         [[NSNotificationCenter defaultCenter] postNotificationName:@"tweetsLoaded" object:tweetsArray];


                 }];
                 }

             }

         }];
    }


}

Hope it is useful.

The problem is that the call to the api is asynchronous. That means that by the time you rerun the array, it isn't yet filled. The answer of satheeshwaran one way to work around this: you send a notification when the download has finished. Another way would be to create a delegate method that is called after the download. This is a pattern that comes across quite frequently.

brainray provides one solution. An easier one would be if you're loading the tweets inside of the TableViewController just call [self.tableView reloadData] after your dispatch_async call.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM