2013-03-31 1 views
5

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?

Antwort

Verwandte Themen