0

我发现自己使用全局变量和 nsrunloop 的组合来强制在整个应用程序中进行同步。虽然它有效,但对我来说似乎有点难看。有没有其他方法可以达到相同的结果?

这是一个典型的例子:

ParkingSpots *parkingSpots = [[[ParkingSpots alloc] initWithMapViewController:self] autorelease];
        keepRunning = YES;
        NSRunLoop *theRL = [NSRunLoop currentRunLoop];
        while (keepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

        UpdateLocation *updatedLocation = [[[UpdateLocation alloc] initWithUserid:@"me" andCoordinate:annotation.coordinate withMapViewController:self]
                                           autorelease];
        NSLog(@"Lat = %f, Long = %f",annotation.coordinate.latitude,annotation.coordinate.longitude);
        [updatedLocation sendUpdate];

在这段代码中,我需要等到parkingSpots 对象完全初始化后再初始化updateLocation。由于 updatelocation 期望parkingSpots 被完全初始化,没有runloop updatedlocation 没有正确初始化。使用 runloop,一切都按预期工作。

然而,这对我来说看起来很丑陋(在我的代码中的不同点设置一个全局变量)。有没有更优雅的解决方案?在此先感谢您的帮助!

4

2 回答 2

2

您可以在您的ParkingSpots类上使用委托模式,并在完成初始化时调用委托。例如

ParkingSpots *parkingSpots = [[[ParkingSpots alloc] initWithMapViewController:self] autorelease];
parkingSpots.delegate = self;
parkingSpots.didInitialiseSelector = @selector(parkingSpotsInitialised:);
[parkingSpots startLengthyInitialisation];

- (void) parkingSpotsInitialised:(ParkingSpots*)parkingSpots {
  UpdateLocation *updatedLocation = [[[UpdateLocation alloc] initWithUserid:@"me" andCoordinate:annotation.coordinate withMapViewController:self] autorelease];
}

您也可以使用通知来实现相同的目的。

于 2009-09-30T14:28:02.440 回答
0

我认为您需要查看objective-c 的同步功能

于 2009-09-30T13:42:22.570 回答