Skip to content
This repository
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 115 lines (96 sloc) 4.638 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
/*
* 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 "FBPlacePickerCacheDescriptor.h"
#import "FBGraphObjectTableDataSource.h"
#import "FBGraphObjectPagingLoader.h"
#import "FBPlacePickerViewController.h"
#import "FBPlacePickerViewController+Internal.h"

@interface FBPlacePickerCacheDescriptor () <FBGraphObjectPagingLoaderDelegate>

@property (nonatomic, readwrite) CLLocationCoordinate2D locationCoordinate;
@property (nonatomic, readwrite) NSInteger radiusInMeters;
@property (nonatomic, readwrite) NSInteger resultsLimit;
@property (nonatomic, readwrite, copy) NSString *searchText;
@property (nonatomic, readwrite, copy) NSSet *fieldsForRequest;
@property (nonatomic, readwrite, retain) FBGraphObjectPagingLoader *loader;

// this property is only used by unit tests, and should not be removed or made public
@property (nonatomic, readwrite, assign) BOOL hasCompletedFetch;

@end

@implementation FBPlacePickerCacheDescriptor

@synthesize locationCoordinate = _locationCoordinate,
            radiusInMeters = _radiusInMeters,
            resultsLimit = _resultsLimit,
            searchText = _searchText,
            fieldsForRequest = _fieldsForRequest,
            loader = _loader,
            hasCompletedFetch = _hasCompletedFetch;

- (id)initWithLocationCoordinate:(CLLocationCoordinate2D)locationCoordinate
                  radiusInMeters:(NSInteger)radiusInMeters
                      searchText:(NSString*)searchText
                    resultsLimit:(NSInteger)resultsLimit
                fieldsForRequest:(NSSet*)fieldsForRequest {
    self = [super init];
    if (self) {
        self.locationCoordinate = locationCoordinate;
        self.radiusInMeters = radiusInMeters <= 0 ? defaultRadius : radiusInMeters;
        self.searchText = searchText;
        self.resultsLimit = resultsLimit <= 0 ? defaultResultsLimit : resultsLimit;
        self.fieldsForRequest = fieldsForRequest;
        self.hasCompletedFetch = NO;
    }
    return self;
}

- (void)dealloc {
    self.fieldsForRequest = nil;
    self.searchText = nil;
    self.loader = nil;
    [super dealloc];
}

- (void)prefetchAndCacheForSession:(FBSession*)session {
    // Place 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];
    
    // create the request object that we will start with
    FBRequest *request = [FBPlacePickerViewController requestForPlacesSearchAtCoordinate:self.locationCoordinate
                                                                          radiusInMeters:self.radiusInMeters
                                                                            resultsLimit:self.resultsLimit
                                                                              searchText:self.searchText
                                                                                  fields:self.fieldsForRequest
                                                                              datasource:datasource
                                                                                 session:session];
    
    self.loader.delegate = nil;
    self.loader = [[[FBGraphObjectPagingLoader alloc] initWithDataSource:datasource
                                                              pagingMode:FBGraphObjectPagingModeAsNeeded]
                   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:FBPlacePickerCacheIdentity
                   skipRoundtripIfCached:NO];
}

- (void)pagingLoaderDidFinishLoading:(FBGraphObjectPagingLoader *)pagingLoader {
    self.loader.delegate = nil;
    self.loader = nil;
    self.hasCompletedFetch = YES;
    
    // achieving detachment
    [self release];
}

@end
Something went wrong with that request. Please try again.