我的代码用于使用递归无法正常工作的Twitter好友 - iOS

时间:2013-03-31 11:06:21

标签: ios objective-c recursion twitter

我尝试使用游标浏览用户的推特朋友。由于你一次得到20个以及下一个光标,我想也许递归是处理这个问题的最佳方法。但是,我相信因为我使用了完成处理程序块,所以它无法正常工作。我一直只得到两页朋友(40),然后又回来了。

- (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];
        }
    }];
}

调用它的方法:

[self.twitterNetwork fetchTwitterFriendsForCrush:self.crush fromCursor:@"-1" usingManagedObjectContext:self.managedObjectContext withSender:self usingCompletionHandler:^{
    //
    [self reloadData];
}];

更新:似乎我在每个请求上都收到相同的next_cursor数据。有没有人经历过这个?或者你在这段代码中看到会导致这种情况的任何内容吗?

1 个答案:

答案 0 :(得分:0)

我发现更复杂的方式更好。你可以使用https://api.twitter.com/1.1/friends/ids.json吗?得到你的朋友ids列表。然后使用1.1 / users / lookup.json,您可以获得用户的完整信息。我写了一个小帮手,用SLRequest(#iOS6)https://github.com/ArchieGoodwin/NWTwitterHelper

来钻取用户朋友