2017-03-31 2 views
3

私はxamarinとモバイル開発者にはかなり新しいです。私は現在Firebaseによるgeofireライブラリをxamarin.iosに移行しています。私は次の目的コードを見つけようとしていて、実際に何をしているのか把握しようとしていますか?そして、そのC#の同等:callbackQueueためNSMutableDictionary&dispatch_asyncネイティブオブジェクトC#同等または類似

@property (nonatomic, strong) NSMutableDictionary *keyEnteredObservers; 

...

GFQueryLocationInfo *info = self.locationInfos[key]; 

[self.keyEnteredObservers enumerateKeysAndObjectsUsingBlock:^(id observerKey, 
                     GFQueryResultBlock block, 
                     BOOL *stop) { 
     dispatch_async(self.geoFire.callbackQueue, ^{   // the callbackQueue is of type @property (nonatomic, strong) dispatch_queue_t callbackQueue; 
      block(key, info.location); 
     }); 
    }]; 

私は現在、タイプBlockingCollection <「タスクを使用しています>

すべてのヘルプは大歓迎です。

答えて

1

NSMutableDictionary.enumerateKeysAndObjectsUsingBlockは、2つの基本的なことを行っています。

  • キーに基づいて辞書をフィルタリングします。それはGCD(グランドセントラルディスパッチ)を介して非同期(dispatch_async)が実行されるよう

  • 辞書の濾過要素は、コードの「ブロック」に利用可能である(LINQのWhereは、C#の代わりとして機能するであろう)。だから、すでに作業ポンプとしてBlockingCollectionを使用して、ので、あなたのタスクにupdateLocationInfoCLLocationにするパラメータであるkeyの文字列を渡している...

注:stopブールから早期終了の原因になりますあなたはまだあなたのオブザーバーのためNSMutableDictionaryを使用している場合は列挙子、代替ようにC#breakが、それはこの文脈で使用されていません...

、あなたはKeysForObjectを経由してフィルタリングすることができます。 GeoFireの私のバージョンでは、BlockingCollection<Action>対タスクを使用して、ラムダを直接作業キューに追加しました。以下のような

何か:はい、私はまだNSMutableDictionaryを使用してい

foreach (var info in keyEnteredObservers.KeysForObject(firebaseHandle)) 
{ 
    var nonCapturedLocation = info.location.Copy(); // location = CLLocation, do not capture entire dictionary by ref in lambda 
    callbackQueue.Add(() => 
    { 
     GFQueryResultBlock(key, nonCapturedLocation); 
    }); 
} 
+0

、これは私が必要とする正確に何です。ありがとうございました。 –