2017-09-23 53 views
-1

我學習了自己的目標c,並沒有採取任何課程。因此,在編寫iOS應用程序時,有時候我會對小事感到困惑。這個問題可能非常蹩腳,但我找不到任何解決方案,或者我無法理解解決方案。這是我的情況:如何在主視圖控制器中創建一個用戶定義的方法,以便在iOS中連續更新值?

我的應用程序包含單個視圖控制器(默認的一個)。我想從加速計,陀螺儀和磁力計獲得連續值,並使用這些值使用行人航位推算(PDR)來估計用戶位置。爲此,我使用CoreMotion並在頭文件中創建了CLMotionManager(motionManager)屬性。使用這種經理,我可以檢查傳感器是否可用,並得到他們的價值觀,例如:

if([_motionManager isAccelerometerAvailable]) 
{ 
    _motionManager.accelerometerUpdateInterval = 0.1; 
    [_motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc]init] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) { 
      x=accelerometerData.acceleration.x; 
      y = accelerometerData.acceleration.y; 
      z = accelerometerData.acceleration.z; 

    }];} 

同樣,我可以從陀螺儀和磁強計值。我按下一個按鈕後得到一個IBAction方法內這些值:

-(IBAction)startSensor:(id)sender 
{ 
//Getting accelerometer, gyroscope, and magnetometer values. 
} 

的PDR操作在我的下一個方法發生,因爲:

-(void)thePDROperationWith:(NSArray*)accelerometerValues gyroscopeValues:(NSArray*)gyros magnetometerValues:(NSArray*)magneto 
{ 
//The PDR operations with accelerometer, gyroscope and magnetometer values 
} 

現在,我的問題是:

1)如何從thePDROperationWith:: 方法獲得連續的PDR操作值?我在startSensor方法中調用了此方法,但是當我按下按鈕時,I 僅獲取一次該值。此外,我是否應該在頭文件中聲明這個方法 (如用戶定義的NSObject子類)?

2)是什麼樣

//a method in CLBeaconManager delegate -(void)beaconManager:(CLBeaconManager*)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { //code }用戶定義的方法和委託方法之間的差異?

此委託方法(我期望我使用正確的術語)連續運行以定義CLBeaconRegion中的信標範圍。我如何爲我的目的製作這種方法?

謝謝。

回答

1

startAccelerometerUpdatesToQueue做了什麼名字 - 它開始一系列的加速度計更新方法,並將它們傳達給你的提名隊列,在你的情況下這是一個任意的後臺隊列。

因此,每當操作系統在加速度計中發現變化時,都會執行當前將值存儲到xyz的代碼。您可能會從陀螺儀和磁力儀獲得類似的永久更新序列。

因此,這些信息流可能是更新的觸發器。每次新的加速計,陀螺儀或磁力計更新到達時,都要更新您的知識。如果你爲這三件事情中的每一件都創建一個單獨的隊列,那麼很可能你最終會在不同的線程上爲它們提供服務,所以你需要擔心併發數據訪問。或者你可以使用[NSOperationQueue mainQueue]在同一個隊列上接收所有更新,如果你只是想讓操作系統爲你編寫一切,那麼UIKit也可以運行這個更新)。

委託方法是表示一個類委託給另一個類的函數。在這種情況下,信標管理器知道如何跟蹤信標,但是在這個應用程序中作爲跟蹤信標的結果不適合做什麼。因此,它委派來自信標更改的決策。

的Objective-C可以讓你成爲真正的鬆動這些事情,所以你可能好像在看舊的代碼看到一些很正規的辦法,但現在正常的方法是聲明一個委託協議,如:

@class MyClass; // Declare that there is a class called MyClass. 

// Define a protocol for delegates. 
@protocol MyProtocol 
- (void)thisClass:(MyClass *)class learntFact:(Fact *)fact; 
@end 

// Here's MyClass for real 
@interface MyClass 
@property(nonatomic, weak) id<MyProtocol> factDelegate; 
@end 

然後當MyClass實例有話要說,它只是告訴代表:想要成爲一個代表組instanceOfMyClass.factDelegate = self,具有相關的協議宣佈支持

[self.factDelegate thisClass:self learntFact:...fact here...]; 

,有人。

相關問題