У меня есть метод класса, который хочет использовать CLLocationManager и некоторые из его методов делегата.
Каков наилучший способ получить доступ к методам делегата из метода класса, поскольку у меня нет истинного уровня экземпляра «я»? Я мог бы создать экземпляр self и использовать его в качестве делегата, что позволит запускать методы делегата, но не покажет, как получить данные. Каков наилучший подход?
// desired end function, which runs a block when location is found
[SFGeoPoint geoPointForCurrentLocationInBackground:^(SFGeoPoint *geoPoint, NSError *error) {
if (!error) {
// do something with the new geoPoint
NSLog(@"GeoPoint: %@", geoPoint);
}
}];
// SFGeoPoint class, key points
static CLLocationManager *_locationManager = nil;
// get geo point for current location and call block with it
+ (void) geoPointForCurrentLocationInBackground:( void ( ^ )( SFGeoPoint*, NSError* ) ) locationFound {
SFGeoPoint *point = [[SFGeoPoint alloc] init];
_locationManager = [[CLLocationManager alloc] init];
// ?????????
_locationManager.delegate = self; // this gives a warning about incompatible pointer type assigning Delegate from Class;
_locationManager.delegate = point; // could work, but how to get feedback?
_locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[_locationManager startUpdatingLocation];
[_locationManager startUpdatingLocation];
locationFound(point, nil);
}
/////////// Core Location Delegate
+ (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
[_locationManager stopUpdatingLocation];
if (_locationBlock) {
_locationBlock(newLocation);
}
}
id
:= (id)self
. Концептуально они не так уж сильно отличаются, просто в этом случае вы используете сам объект класса в качестве делегата вместо некоторого экземпляра, избавляя вас от необходимости создавать другой объект. - person newacct   schedule 27.03.2014