gpt4 book ai didi

objective-c - 在类方法中使用委托(delegate),objective-c

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:59 29 4
gpt4 key购买 nike

我有一个类方法想要使用 CLLocationManager 及其一些委托(delegate)方法。

因为我没有真正的实例级别“self”,所以从类方法访问委托(delegate)方法的最佳方法是什么?我可以实例化一个 self 并用作委托(delegate),这将使委托(delegate)方法运行,但不显示如何获取数据。什么是最好的方法?

// 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);
}
}

最佳答案

我会重做您正在做的事情,而不是使用类方法。相反,使用共享实例单例,这将允许您编写几乎相同的代码,但为您提供了一个实例来处理并因此存储变量和分配委托(delegate)。

以防万一你不熟悉语法:

+ (instancetype) shared
{
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}

然后只需将所有 +(类)方法更改为 -(实例)方法并使用 [[MyClass shared] doWhatever] 访问您的类;

使用可选包装器进行编辑:

如果你真的想在没有实例的情况下调用方法,你可以编写一个包装器来做这样的事情:

+ (void) doWhatever
{
[[self shared] doWhatever];
}

也就是说,我通常不建议这样做,因为您不会节省太多代码,并且将来可能会混淆从调用者的角度来看这实际上是哪种方法。

关于objective-c - 在类方法中使用委托(delegate),objective-c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22669376/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com