Sto provando a sfogliare gli amici di Twitter di un utente usando i cursori. Dato che si ottiene 20 alla volta insieme a un cursore successivo, ho pensato che forse la ricorsione fosse il modo migliore per gestirlo. Tuttavia, credo perché sto usando blocchi di completamento, non funziona correttamente. Continuo a ricevere solo due pagine di amici (40) e ritorna.Il mio codice per sfogliare gli amici di Twitter usando la ricorsione non funziona - iOS
- (void)fetchTwitterFriendsForCrush:(Crush*)crush
fromCursor:(NSString*)cursor
usingManagedObjectContext:(NSManagedObjectContext*)moc
withSender:(id) sender
usingCompletionHandler:(void(^)())completionHandler
{
// twitter returns "0" when there are no more pages to receive
if (([cursor isEqualToString:@"0"]) || (cursor == nil)) {
completionHandler();
return;
}
NSString *urlString =
[NSString stringWithFormat:@"https://api.twitter.com/1.1/friends/list.json?cursor%@skip_status=1", cursor];
NSURL *requestURL = [NSURL URLWithString:urlString];
SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter
requestMethod:SLRequestMethodGET
URL:requestURL
parameters:nil];
request.account = self.twitterAccount;
[request performRequestWithHandler:
^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
if (error) {
NSLog(@"Error getting twitter friends = %@", error);
}
if (responseData) {
NSError *jsonError;
NSString *nextCursor = nil;
NSMutableArray *friendsArray = [NSMutableArray arrayWithCapacity:100];
NSDictionary *friendsDictionary =
[NSJSONSerialization JSONObjectWithData:responseData
options:0
error:&jsonError];
if ([friendsDictionary valueForKey:@"next_cursor_str"]) {
nextCursor = [friendsDictionary valueForKey:@"next_cursor_str"];
}
if ([friendsDictionary valueForKey:@"users"]) {
[friendsArray addObjectsFromArray:[friendsDictionary valueForKey:@"users"]];
}
for (NSDictionary *singleFriend in friendsArray) {
NSString *twitterID = [singleFriend valueForKey:@"id_str"];
NSString *name = [singleFriend valueForKey:@"name"];
NSString *screenName = [singleFriend valueForKey:@"screen_name"];
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^(void) {
// update model
TwitterFriend *newTwitterFriend =
[TwitterFriend twitterFriendWithTwitterID:twitterID
forCrush:crush
usingManagedObjectContext:moc];
newTwitterFriend.name = name;
newTwitterFriend.screenName = screenName;
});
}
[self fetchTwitterFriendsForCrush:crush
fromCursor:nextCursor
usingManagedObjectContext:moc
withSender:self
usingCompletionHandler:nil];
}
}];
}
E il metodo che lo chiama:
[self.twitterNetwork fetchTwitterFriendsForCrush:self.crush fromCursor:@"-1" usingManagedObjectContext:self.managedObjectContext withSender:self usingCompletionHandler:^{
//
[self reloadData];
}];
UPDATE: Sembra che sto ricevendo gli stessi dati next_cursor su ogni richiesta. Qualcuno ha provato questo? O vedi qualcosa in questo codice che potrebbe causare quello?