Bagaimana saya bisa meneruskan Block
ke Function
/ Method
?
Saya mencoba - (void)someFunc:(__Block)someBlock
tanpa hasil.
yaitu. Apa jenis untuk Block
?
objective-c
objective-c-blocks
Jacksonkr
sumber
sumber
Jawaban:
Jenis blok bervariasi tergantung pada argumen dan jenis kembalinya. Dalam kasus umum, tipe blok dideklarasikan dengan cara yang sama dengan tipe pointer fungsi, tetapi mengganti
*
dengan a^
. Salah satu cara untuk meneruskan blok ke metode adalah sebagai berikut:Tapi seperti yang Anda lihat, itu berantakan. Anda bisa menggunakan a
typedef
untuk membuat pembersih jenis blok:Dan kemudian meneruskan blok itu ke metode seperti:
sumber
NSNumber *
ataustd::string&
atau apa pun yang Anda bisa berikan sebagai argumen fungsi. Ini hanya sebuah contoh. (Untuk blok yang setara kecuali untuk digantiid
denganNSNumber
,typedef
akan menjaditypedef void (^ IteratorWithNumberBlock)(NSNumber *, int);
.)NS_NOESCAPE
, tetapienumerateObjectsUsingBlock
saya diberi tahu tidak melarikan diri, namun saya tidak melihatNS_NOESCAPE
di mana pun di situs, juga tidak melarikan diri disebutkan sama sekali dalam dokumen Apple. Bisakah kamu menolong?Penjelasan termudah untuk pertanyaan ini adalah ikuti templat ini:
1. Blok sebagai parameter metode
Templat
Contoh
Penggunaan kasus lainnya:
2. Blokir sebagai Properti
Templat
Contoh
3. Blokir sebagai argumen metode
Templat
Contoh
4. Blokir sebagai variabel lokal
Templat
Contoh
5. Blokir sebagai typedef
Templat
Contoh
sumber
Ini mungkin membantu:
sumber
Anda dapat melakukannya seperti ini, melewati blok sebagai parameter blok:
sumber
Satu lagi cara untuk melewatkan blok menggunakan fungsi с pada contoh di bawah ini. Saya sudah membuat fungsi untuk melakukan apa saja di latar belakang dan antrian utama.
file blocks.h
file blocks.m
Dari impor blok. H bila perlu dan aktifkan:
sumber
Anda juga dapat mengatur blok sebagai properti sederhana jika itu berlaku untuk Anda:
pastikan bahwa properti blok adalah "salin"!
dan tentu saja Anda juga dapat menggunakan typedef:
sumber
Anda juga memanggil atau memanggil blok menggunakan sintaks fungsi c biasa
Info lebih lanjut tentang blok di sini
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7-SW1
sumber
Saya selalu cenderung lupa tentang sintaks blok. Ini selalu muncul di pikiran saya ketika saya harus mendeklarasikan blok. Saya harap ini membantu seseorang :)
http://fuckingblocksyntax.com
sumber
Saya menulis sebuahlockBlock untuk kelas yang akan mengembalikan nilai-nilai dadu setelah mereka diguncang:
Tentukan typedef dengan returnType ( deklarasi di
.h
atas@interface
)Tentukan a
@property
untuk blok (.h
)Tetapkan metode dengan
finishBlock
(.h
)Masukkan metode yang didefinisikan sebelumnya dalam
.m
file dan komitfinishBlock
untuk@property
didefinisikan sebelumnyaUntuk memicu
completionBlock
lulus Variabel jenis yang telah ditentukan sebelumnya (Jangan lupa untuk memeriksa apakahcompletionBlock
ada)sumber
Terlepas dari jawaban yang diberikan pada utas ini, saya benar-benar berjuang untuk menulis suatu fungsi yang akan mengambil Blok sebagai fungsi - dan dengan parameter. Akhirnya, inilah solusi yang saya buat.
Saya ingin menulis fungsi umum
loadJSONthread
, yang akan mengambil URL Layanan Web JSON, memuat beberapa data JSON dari URL ini di utas latar belakang, lalu mengembalikan hasil NSArray * kembali ke fungsi pemanggilan.Pada dasarnya, saya ingin menyembunyikan semua kompleksitas background-thread dalam fungsi generik yang dapat digunakan kembali.
Inilah cara saya memanggil fungsi ini:
... dan ini adalah bagian yang saya perjuangkan: cara mendeklarasikannya, dan cara membuatnya memanggil fungsi Blok begitu data dimuat, dan meneruskan
Block
NSArray * dari catatan yang dimuat:Pertanyaan StackOverflow ini menyangkut cara memanggil fungsi, melewati Blok sebagai parameter, jadi saya menyederhanakan kode di atas, dan tidak termasuk
loadJSONDataFromURL
fungsi.Tetapi, jika Anda tertarik, Anda dapat menemukan salinan fungsi pemuatan JSON ini di blog ini: http://mikesknowledgebase.azurewebsites.net/pages/Services/WebServices-Page6.htm
Semoga ini bisa membantu beberapa pengembang XCode lainnya! (Jangan lupa memilih pertanyaan ini dan jawaban saya, jika ya!)
sumber
Templat lengkapnya terlihat seperti
sumber