2010-03-18 6 views
0

Je veux attendre que latitude.text et longtitude.text soient remplis avant d'envoyer un tweet, ce code fonctionne bien, mais je préfère ne pas mettre la partie tweeting dans locationManager car j'ai aussi vouloir parfois mettre à jour l'emplacement actuel sans envoyer un tweet. Comment puis-je m'assurer que le txt est rempli avant d'envoyer le tweet sans le faire?Attendez que CLLocationManager se termine avant de tweeter

- (IBAction)update { 
    latitude.text [email protected]""; 
    longitude.text [email protected]""; 
    locmanager = [[CLLocationManager alloc] init]; 
    [locmanager setDelegate:self]; 
    [locmanager setDesiredAccuracy:kCLLocationAccuracyBest]; 
    [locmanager startUpdatingLocation]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    CLLocationCoordinate2D location = [newLocation coordinate]; 
    latitude.text = [NSString stringWithFormat: @"%f", location.latitude]; 
    longitude.text = [NSString stringWithFormat: @"%f", location.longitude]; 

    TwitterRequest * t = [[TwitterRequest alloc] init]; 
    t.username = @"****"; 
    t.password = @"****"; 
    [twitterMessageText resignFirstResponder]; 
    loadingActionSheet = [[UIActionSheet alloc] initWithTitle:@"Posting To Twitter..." delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil]; 
    [loadingActionSheet showInView:self.view]; 
    [t statuses_update:twitterMessageText.text andLat:latitude.text andLong:longitude.text delegate:self requestSelector:@selector(status_updateCallback:)]; 
[email protected]""; 
} 

Répondre

2

Vous pouvez enregistrer des écouteurs dans votre classe qui implémente le CLLocationManagerDelegate. Par exemple,

@interface GPS : NSObject <CLLocationManagerDelegate> { 

    CLLocationManager *locationManager; 

    NSMutableArray *listeners; 
} 

- (void) addListener:(id<GPSListener>)listener; 
@end 

@implementation GPS 
- (IBAction)update { 
    latitude.text [email protected]""; 
    longitude.text [email protected]""; 
    locmanager = [[CLLocationManager alloc] init]; 
    [locmanager setDelegate:self]; 
    [locmanager setDesiredAccuracy:kCLLocationAccuracyBest]; 
    [locmanager startUpdatingLocation]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    CLLocationCoordinate2D location = [newLocation coordinate]; 
    latitude.text = [NSString stringWithFormat: @"%f", location.latitude]; 
    longitude.text = [NSString stringWithFormat: @"%f", location.longitude]; 

    // Inform the listeners. 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    for (id<GPSListener> listener in listeners) 
    { 
    @try 
    { 
     [listener onLocationChangeForLatitude:latitude.text longitude:longitude]; 
    } 
    @catch (NSException *e) 
    { 
     NSLog(@"Unhandled exception in onLocationChange"); 
    } 
    } 
    [pool release]; 
} 

- (void) addListener:(id<GPSListener>)listener 
{ 
    [listeners addObject:listener]; 
} 
@end 

Vous pouvez avoir un ensemble d'écouteurs qui s'enregistrent avec votre objet GPS.

@protocol GPSListener { 
- (void) onLocationChangeForLatitude:(NSString *)latitude longitude:(NSString *)longitude; 
} 

Ainsi, vous pouvez maintenant avoir un TweetGPSListener

@interface TweetGPSListener : NSObject <GPSListener> { 
} 
@end 

@implementation TweetGPSListener 
- (void) onLocationChangeForLatitude:(NSString *)latitude longitude:(NSString *)longitude { 
    TwitterRequest * t = [[TwitterRequest alloc] init]; 
    t.username = @"****"; 
    t.password = @"****"; 
    [twitterMessageText resignFirstResponder]; 
    loadingActionSheet = [[UIActionSheet alloc] initWithTitle:@"Posting To Twitter..."  delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil]; 
    [loadingActionSheet showInView:self.view]; 
    [t statuses_update:twitterMessageText.text andLat:latitude andLong:longitude delegate:self requestSelector:@selector(status_updateCallback:)]; 
    [email protected]""; 
} 
@end 

Donc, pour les cas que vous ne voulez pas de tweet, soit ne pas vous inscrire à l'auditeur, supprimez l'auditeur ou ajouter une logique à l'TweetListener savoir quand il est approprié de tweeter.

+0

Cela semble vraiment compliqué car je n'ai aucune idée de ce que vous dites (j'ai juste commencé à apprendre l'objectif C il y a 3 jours) Puis-je avoir une autre fonction locationmanager? – user295944

+0

Ce n'est vraiment pas si compliqué. Je ne sais pas ce que vous entendez par "une autre fonction de gestionnaire de lieu". Je pensais que vous vouliez sortir votre code du gestionnaire de localisation, alors je vous donnais un moyen de le faire. En outre, en utilisant un auditeur d'autres parties de votre application peuvent décider quand enregistrer ou supprimer l'écouteur. Je suggère de passer du temps à comprendre certains concepts d'Objective-C (comme les protocoles) et cela pourrait vous aider à trouver une solution. –

Questions connexes