2011-12-08 15 views
22

Czy można uruchomić blok ukończenia głównego wątku?Jak mogę odzyskać zwracaną wartość z bloku zakończenia?

Na przykład, jeden sposób, który zwraca wartość:

- (int)test 
{ 

    /* here one method is called with completion block with return type void */ 

    [obj somemethodwithcompeltionblock: 
     { 
     /* here I am getting my Int which I want to return */ 
     } 
     ]; 
} 

ale nie można zobaczyć w jaki sposób, aby przywrócić wartość całkowitą od wewnątrz bloku realizacji, jako wynik tego sposobu, ponieważ zakończenie blok działa na wątku tła.

Jak mogę to zrobić?

+0

Więc ... nie używaj blok, który tworzy nowy wątek. Czy nie jest to framework lub blok biblioteki, którego nie można zmodyfikować? – JoePasq

Odpowiedz

29

Brakuje Ci podstaw do asynchronicznego programowania za pomocą bloków. Nie możesz mieć zwróconego bloku z dowolnego miejsca, ale z własnego zakresu. Pomyśl o każdym bloku jako własnej metodzie, zamiast kodu śródliniowego.

myślę co szukasz jest coś podobnego do tego ...

- (void)testWithHandler:(void(^)(int result))handler 
{ 
    [obj somemethodwithcompeltionblock:^{ 
      int someInt = 10; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       handler(10); 
      }); 
     } 
     ]; 
} 


- (void)callSite 
{ 
    [self testWithHandler:^(int testResult){ 
     NSLog(@"Result was %d", testResult); 
    }]; 
} 
Powiązane problemy