我正在尝试将Twitter时间线添加到我的iOS应用中。
Twitter在此提供官方示例代码:
https://dev.twitter.com/docs/ios/making-api-requests-slrequest
我的问题是:第70行
if (timelineData) {
NSLog(@"Timeline Response: %@\n", timelineData);
}
时间线数据已成功打印到控制台。 我试着添加
self.dict = timelineDate;
和
return self.dict;
在函数的末尾,但实际上它返回一个空字典。 我注意到该过程是在另一个线程中完成的,所以我尝试了
dispatch_async(dispatch_get_main_queue(), ^{
self.dict = timelineDate;
};
但它仍然不起作用。 这可能很容易解决,但我真的找不到Apple或Twitter的任何资源。有人可以帮忙吗?
答案 0 :(得分:2)
我使用此功能在我的应用程序中加载推文(兼容twitter api v1.1,但需要在设备中同步Twitter帐户。)我使用TWRequest执行此操作,您也可以使用SLRequest执行相同操作。
//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];
}];
}
}
}];
}
}
希望它有用。
答案 1 :(得分:0)
问题是对api的调用是异步的。这意味着当你重新运行数组时,它还没有被填充。 satheeshwaran的答案解决此问题的一种方法:下载完成后发送通知。另一种方法是创建在下载后调用的委托方法。 这是一种经常遇到的模式。
答案 2 :(得分:0)
brainray提供了一种解决方案。如果您在TableViewController内部加载推文,则只需在[self.tableView reloadData]
调用后调用dispatch_async
即可。