Jak mogę przejść Block
do Function
/ Method
?
Próbowałem - (void)someFunc:(__Block)someBlock
bez skutku.
to znaczy. Jaki jest typ dla Block
?
objective-c
objective-c-blocks
Jacksonkr
źródło
źródło
Odpowiedzi:
Typ bloku różni się w zależności od jego argumentów i typu zwracanego. W ogólnym przypadku typy bloków są deklarowane w taki sam sposób, jak typy wskaźników do funkcji, ale zastępując
*
znak^
. Jeden ze sposobów przekazania bloku do metody jest następujący:Ale jak widać, jest to niechlujne. Zamiast tego możesz użyć a,
typedef
aby uczynić typy bloków czystszymi:Następnie przekaż ten blok do takiej metody:
źródło
NSNumber *
lubstd::string&
czy cokolwiek innego można przekazać jako argument funkcji. To tylko przykład. (Dla bloku, który jest równoważny, z wyjątkiem zastąpieniaid
przezNSNumber
,typedef
byłobytypedef void (^ IteratorWithNumberBlock)(NSNumber *, int);
.)NS_NOESCAPE
, aleenumerateObjectsUsingBlock
powiedziano mi, że nie są uciekające, ale nie widzęNS_NOESCAPE
nigdzie w witrynie ani w ogóle nie wspomniano o ucieczce w dokumentach Apple. Możesz pomóc?Najłatwiejszym wyjaśnieniem tego pytania jest skorzystanie z tych szablonów:
1. Blok jako parametr metody
Szablon
Przykład
Inne zastosowania przypadków:
2. Blok jako właściwość
Szablon
Przykład
3. Blok jako argument metody
Szablon
Przykład
4. Blokuj jako zmienną lokalną
Szablon
Przykład
5. Block as a typedef
Szablon
Przykład
źródło
Może to być pomocne:
źródło
Możesz to zrobić, przekazując blok jako parametr bloku:
źródło
Jeszcze jeden sposób na przekazanie bloku przy użyciu funkcji с w przykładzie poniżej. Stworzyłem funkcje, które wykonują wszystko w tle i w głównej kolejce.
plik blocks.h
plik blocks.m
Następnie zaimportuj bloki.h w razie potrzeby i wywołaj go:
źródło
Możesz również ustawić blok jako prostą właściwość, jeśli ma to zastosowanie w Twoim przypadku:
upewnij się, że właściwość bloku to „kopia”!
i oczywiście możesz też użyć typedef:
źródło
Również wywołujesz lub wywołujesz blok używając zwykłej składni funkcji c
Więcej informacji o blokach tutaj
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7-SW1
źródło
Zawsze zapominam o składni bloków. To zawsze przychodzi mi na myśl, gdy muszę zadeklarować blok. Mam nadzieję, że komuś to pomoże :)
http://fuckingblocksyntax.com
źródło
Napisałem completeBlock dla klasy, która zwróci wartości kostek po ich wstrząśnięciu:
Zdefiniuj typedef z returnType (
.h
powyżej@interface
deklaracji)Zdefiniuj a
@property
dla bloku (.h
)Zdefiniuj metodę za pomocą
finishBlock
(.h
)Wkładka poprzedniej metody zdefiniowanej w
.m
pliku i zobowiązać sięfinishBlock
do@property
zdefiniowanych wcześniejAby wyzwolić,
completionBlock
podaj do niego predefiniowany typ zmiennej (nie zapomnij sprawdzić, czycompletionBlock
istnieje)źródło
Pomimo odpowiedzi udzielonych w tym wątku, naprawdę starałem się napisać funkcję, która przyjmowałaby blok jako funkcję - i to z parametrem. Ostatecznie oto rozwiązanie, które wymyśliłem.
Chciałem napisać funkcję ogólną
loadJSONthread
, która pobierałaby adres URL usługi internetowej JSON, ładowała niektóre dane JSON z tego adresu URL w wątku w tle, a następnie zwracała wyniki NSArray * z powrotem do funkcji wywołującej.Zasadniczo chciałem ukryć całą złożoność wątku tła w ogólnej funkcji wielokrotnego użytku.
Oto jak nazwałbym tę funkcję:
... i to jest bit, z którym się zmagałem: jak to zadeklarować i jak zmusić go do wywołania funkcji Block po załadowaniu danych i przekazania
Block
NSArray * załadowanych rekordów:To pytanie StackOverflow dotyczy tego, jak wywoływać funkcje, przekazując Block jako parametr, więc uprościłem powyższy kod i nie uwzględniłem
loadJSONDataFromURL
funkcji.Ale jeśli jesteś zainteresowany, możesz znaleźć kopię tej funkcji ładowania JSON na tym blogu: http://mikesknowledgebase.azurewebsites.net/pages/Services/WebServices-Page6.htm
Mam nadzieję, że pomoże to innym programistom XCode! (Nie zapomnij zagłosować na to pytanie i moją odpowiedź, jeśli tak!)
źródło
Wygląda jak pełny szablon
źródło