2009-09-30 61 views
0

我發現自己使用全局變量和nsrunloop的組合來強制同步整個應用程序。雖然它起作用,但對我來說似乎有點難看。有沒有其他方法可以達到相同的效果?iphone cocoa使用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預計ParkingSpots將被完全初始化,而runloop updatedlocation沒有正確初始化。使用runloop一切都按預期工作。

但是,這看起來很醜陋(在我的代碼中的各個點設置全局變量)。有沒有更優雅的解決方案?在此先感謝您的幫助!

回答

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]; 
} 

您也可以使用通知來實現相同的目的。

+0

@納森謝謝你的建議。我雖然關於使用通知,但對如何實現它們有點困惑。你認爲有可能發佈一些僞代碼以使其有點清晰嗎?提前致謝! – ennuikiller 2009-09-30 14:35:55

+0

謝謝我使用nsnotifications和它的工作出色! – ennuikiller 2009-09-30 21:36:15

0

我認爲你需要看看objective-c的synchronization feature

+0

這看起來似乎可以保護代碼的「關鍵區域」不會由多於1個線程執行。我需要的是等待一段代碼完成(parkingpot初始化),然後再運行(更新位置初始化) – ennuikiller 2009-09-30 13:55:32

+0

然後您應該使用委託設計模式。 – Eimantas 2009-09-30 16:40:15