2016-03-30 17 views
2

NSMutableOrderedSet'im var.EnumerateObjectsUsingBlock tarafından bulunan öğeyi nasıl iade edersiniz?

Numaralandırmam gerekiyor ve kümeye yerleştirilen tek seçenek blok temelli gibi görünüyor. Yani blok bazlı seçeneklerinin en basit toplama, ben

[anNSMutableOrderedSet enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 
    if ([(SomeClass*)obj isWhatIWant]) { 
     *stop = YES; 
     // Ok, found what I'm looking for, but how do I get it out to the rest of the code?   
    } 
}] 

cevap

2

Sen seslenmek Görüşme kod geri/blok geçmek gerekir ... böyle bir şey var.

- (void)someMethod 
{ 
    [self enumerateWithCompletion:^(NSObject *aObject) { 
     // Do something with result 
    }];  
} 

- (void)enumerateWithCompletion:(void (^)(NSObject *aObject))completion 
{ 

[anNSMutableOrderedSet enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 
    if ([(SomeClass*)obj isWhatIWant]) { 
     *stop = YES; 
     if (completion) { 
      completion(obj); 
     } 
    } 
}]; 
} 

Ayrıca heyet kullanın ve geri nesneyi döndürmek için tanımladığınız bir temsilciye diyebiliriz.

[self.delegate enumerationResultObject:obj]; 

GÜNCELLEME:

Gerçekleşen enumerateObjectsUsingBlock: daha iyi bir yaklaşım bir __block değişkeni kullanmak olacaktır böylece aslında, eşzamanlı olarak adlandırılır. Geri arama hala işe yarıyor, ancak yanıltıcı olarak yorumlanabilir.

+0

o da mümkün olabilir mi bloğun dışına '__block SomeClass * someClassVar '' i kullanın ve sonra bloğun içinde,' 'someClassVar = obj' sonuç nesnesini bloğun dışında yer alan blok değişkenine atamak mı? Henüz denemedim, ancak __blok anahtar kelimesini doğru bir şekilde anlayabiliyorsam, bu işe yarayacak görünüyor. –

+0

@Logicsaurus Rex evet bu işe yarayacak. __block anahtar sözcüğü hakkında daha fazla bilgi için şu bağlantıyı kontrol edin: http://stackoverflow.com/questions/7080927/what-does-the-block-keyword-mean –

+0

Evet bir blok değişkeni de işe yarayacaktır. Ancak bu yaklaşımı kullanırken kapsamın farkında olun. Açık bir geri çağırma kullanarak daha kolay okunabilir buluyorum, ancak size kalmış ve uygulamanıza nasıl uygulanabileceğine bağlı. İyi şanslar. – Tim

4

Tamamlama bloğu içinde bir değer atamak için __blok işlevini kullanabilirsiniz. Bu durumda Weak Self

__weak SomeClass *weakSelf = self; 
    [anNSMutableOrderedSet enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 
     if ([(SomeClass*)obj isWhatIWant]) { 
      weakSelf = (SomeClass*)obj; 
      *stop = YES; 
      // Ok, found what I'm looking for, but how do I get it out to the rest of the code? 
     } 
    }]; 

//you Have to use weakSelf outside the block 
-1

deneyin en kolay şey enumerateObjectsUsingBlock: kullanmamayı olurdu ve sadece yerine hızlı sıralamayı kullanınız:

for (SomeClass *obj in anNSMutableOrderedSet) { 
    if ([obj isWhatIWant]) { 
     yourVariable = obj; 
     break; 
    } 
} 
+0

Bu hiçbir anlam ifade etmiyor ve korkunç bir fikir. "Self" türünü ve "anNSMutableOrderedSet" öğesindeki nesnelerin türünü karıştırıyorsunuz. Çoğu durumda bu türler aynı olmayacaktır. –

1

ile

__block yourClass *yourVariable; 
[anNSMutableOrderedSet enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 
    if ([(SomeClass*)obj isWhatYouWant]) { 
     yourVariable = obj; 
     *stop = YES; 
    } 
}] 

NSLog(@"Your variable value : %@",yourVariable); 
İlgili konular