Skip to content
Find file
Fetching contributors…
Cannot retrieve contributors at this time
138 lines (112 sloc) 4.38 KB
/*
* Copyright 2012 Facebook
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import "FBFriendPickerCacheDescriptor.h"
#import "FBFriendPickerViewController+Internal.h"
#import "FBSession.h"
#import "FBRequest.h"
#import "FBRequestConnection.h"
#import "FBGraphObjectTableDataSource.h"
#import "FBGraphObjectPagingLoader.h"
@interface FBFriendPickerCacheDescriptor () <FBGraphObjectPagingLoaderDelegate>
@property (nonatomic, readwrite, copy) NSSet *fieldsForRequest;
@property (nonatomic, readwrite, copy) NSString *userID;
@property (nonatomic, readwrite, retain) FBGraphObjectPagingLoader *loader;
// these properties are only used by unit tests, and should not be removed or made public
@property (nonatomic, readwrite, assign) BOOL hasCompletedFetch;
@property (nonatomic, readwrite, assign) BOOL usePageLimitOfOne;
- (void)setUsePageLimitOfOne;
@end
@implementation FBFriendPickerCacheDescriptor
@synthesize fieldsForRequest = _fieldsForRequest,
userID = _userID,
loader = _loader,
hasCompletedFetch = _hasCompletedFetch,
usePageLimitOfOne = _usePageLimitOfOne;
- (id)init {
return [self initWithUserID:nil
fieldsForRequest:nil];
}
- (id)initWithUserID:(NSString*)userID {
return [self initWithUserID:userID
fieldsForRequest:nil];
}
- (id)initWithFieldsForRequest:(NSSet*)fieldsForRequest {
return [self initWithUserID:nil
fieldsForRequest:fieldsForRequest];
}
- (id)initWithUserID:(NSString*)userID fieldsForRequest:(NSSet*)fieldsForRequest {
self = [super init];
if (self) {
self.fieldsForRequest = fieldsForRequest ? fieldsForRequest : [NSSet set];
self.userID = userID;
self.hasCompletedFetch = NO;
self.usePageLimitOfOne = NO;
}
return self;
}
- (void)dealloc {
self.fieldsForRequest = nil;
self.userID = nil;
self.loader = nil;
[super dealloc];
}
- (void)prefetchAndCacheForSession:(FBSession*)session {
// Friend queries require a session, so do nothing if we don't have one.
if (session == nil) {
return;
}
// datasource has some field ownership, so we need one here
FBGraphObjectTableDataSource *datasource = [[[FBGraphObjectTableDataSource alloc] init] autorelease];
datasource.groupByField = @"name";
// me or one of my friends that also uses the app
NSString *user = self.userID;
if (!user) {
user = @"me";
}
// create the request object that we will start with
FBRequest *request = [FBFriendPickerViewController requestWithUserID:user
fields:self.fieldsForRequest
dataSource:datasource
session:session];
// this property supports unit testing
if(self.usePageLimitOfOne) {
[request.parameters setObject:@"1"
forKey:@"limit"];
}
self.loader.delegate = nil;
self.loader = [[[FBGraphObjectPagingLoader alloc] initWithDataSource:datasource
pagingMode:FBGraphObjectPagingModeImmediateViewless]
autorelease];
self.loader.session = session;
self.loader.delegate = self;
// make sure we are around to handle the delegate call
[self retain];
// seed the cache
[self.loader startLoadingWithRequest:request
cacheIdentity:FBFriendPickerCacheIdentity
skipRoundtripIfCached:NO];
}
- (void)setUsePageLimitOfOne {
self.usePageLimitOfOne = YES;
}
- (void)pagingLoaderDidFinishLoading:(FBGraphObjectPagingLoader *)pagingLoader {
self.loader.delegate = nil;
self.loader = nil;
self.hasCompletedFetch = YES;
// this feels like suicide!
[self release];
}
@end
Jump to Line
Something went wrong with that request. Please try again.