2017-03-31 27 views
3

我對xamarin和移動開發相當陌生。我目前正在將Firebase的geofire庫遷移到xamarin.ios。我遇到了下面的Objective-C代碼並試圖找出實際上在做什麼?和C#的等效: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 <「的任務>

任何幫助的callbackQueue是極大的讚賞。

回答

1

A NSMutableDictionary.enumerateKeysAndObjectsUsingBlock在這方面是做兩件基本的事情。

  • 它根據密鑰過濾字典。 (一個LINQ Where將工作爲C#替換),因爲它是通過GCD(大中央調度)異步(dispatch_async)執行

  • 字典的過濾元件可用於一個的代碼「塊」。所以,你已經在使用BlockingCollection作爲工作泵,所以通過key字符串,是一個參數updateLocationInfoCLLocation你的任務......

注:stop布爾將導致從早早出局枚舉,所以C#break作爲替代品,但它不是在這種情況下使用...

如果你還在使用你的觀察員NSMutableDictionary,您可以通過KeysForObject過濾。在我的版本GeoFire中,我使用了BlockingCollection<Action>與任務,因此將lambda直接添加到工作隊列中。

喜歡的東西:

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

是的,我現在還在使用的NSMutableDictionary,這正是我需要的。謝謝。 –