Ich versuche, durch twitter Freunde eines Benutzers mit Cursors zu blättern. Da Sie mit einem nächsten Cursor 20 gleichzeitig erhalten, dachte ich, dass Rekursion der beste Weg ist, damit umzugehen. Ich glaube jedoch, weil ich Complete-Handler-Blöcke verwende, funktioniert es nicht richtig. Ich bekomme immer nur zwei Seiten Freunde (40), und es kommt zurück.Mein Code für das Paging durch Twitter-Freunde mit Rekursion funktioniert nicht - 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];
}
}];
}
Und die Methode, die es nennt:
[self.twitterNetwork fetchTwitterFriendsForCrush:self.crush fromCursor:@"-1" usingManagedObjectContext:self.managedObjectContext withSender:self usingCompletionHandler:^{
//
[self reloadData];
}];
UPDATE: Es scheint, dass ich die gleichen next_cursor Daten bei jeder Anfrage bin zu empfangen. Hat jemand das erlebt? Oder siehst du irgendetwas in diesem Code, das das verursachen würde?