Saya seorang pemula iOS. Saya memiliki metode pemilih sebagai berikut -
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second
{
}
Saya mencoba menerapkan sesuatu seperti ini -
[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second" afterDelay:15.0];
Tapi itu memberi saya kesalahan mengatakan -
Instance method -performSelector:withObject:withObject:afterDelay: not found
Ada gagasan tentang apa yang saya lewatkan?
iphone
ios
selector
performselector
Suchi
sumber
sumber
invoke
, hubungi:[inv performSelector:@selector(invoke) withObject:nil afterDelay:1];
Saya harus setuju ini adalah solusi yang bagus. Selamat membuat kode semuanya!Karena tidak ada yang namanya
[NSObject performSelector:withObject:withObject:afterDelay:]
metode.Anda perlu merangkum data yang ingin Anda kirim ke dalam beberapa objek Objective C (misalnya NSArray, NSDictionary, beberapa jenis Objective C kustom) dan kemudian meneruskannya melalui
[NSObject performSelector:withObject:afterDelay:]
metode yang terkenal dan disukai.Sebagai contoh:
NSArray * arrayOfThingsIWantToPassAlong = [NSArray arrayWithObjects: @"first", @"second", nil]; [self performSelector:@selector(fooFirstInput:) withObject:arrayOfThingsIWantToPassAlong afterDelay:15.0];
sumber
NSNumber * whatToDoNumber = [NSNumber numberWithBool: doThis];
") Dan berikan sebagai parameter satu, @virata.Anda dapat mengemas parameter Anda menjadi satu objek dan menggunakan metode helper untuk memanggil metode asli Anda seperti yang disarankan Michael, dan yang lainnya sekarang.
Pilihan lainnya adalah dispatch_after, yang akan mengambil satu blok dan mengantrekannya pada waktu tertentu.
double delayInSeconds = 15.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ [self fooFirstInput:first secondInput:second]; });
Atau, seperti yang telah Anda temukan, jika Anda tidak memerlukan penundaan, Anda dapat menggunakan saja
- performSelector:withObject:withObject:
sumber
__weak
untuk memberikan pengatur waktu yang berpura-pura hanya tautan yang lemah kembali ke diri sendiri - sehingga Anda tidak memperpanjang siklus hidup objek Anda secara artifisial dan misalnya jika performSelector: afterDelay: mempengaruhi sesuatu yang sedikit seperti ekor rekursi (meskipun tanpa rekursi) kemudian menyelesaikan siklus penahanan.Opsi paling sederhana adalah mengubah metode Anda untuk mengambil satu parameter yang berisi kedua argumen, seperti
NSArray
atauNSDictionary
(atau menambahkan metode kedua yang mengambil satu parameter, membukanya, dan memanggil metode pertama, lalu memanggil metode kedua pada menunda).Misalnya, Anda dapat memiliki sesuatu seperti:
- (void) fooOneInput:(NSDictionary*) params { NSString* param1 = [params objectForKey:@"firstParam"]; NSString* param2 = [params objectForKey:@"secondParam"]; [self fooFirstInput:param1 secondInput:param2]; }
Dan kemudian untuk menyebutnya, Anda dapat melakukan:
[self performSelector:@selector(fooOneInput:) withObject:[NSDictionary dictionaryWithObjectsAndKeys: @"first", @"firstParam", @"second", @"secondParam", nil] afterDelay:15.0];
sumber
NSDictionary
kehilangan keamanan tipe. Tidak ideal.performSelector:
(atauNSInvocation
). Jika itu masalah, pilihan terbaik mungkin adalah melalui GCD.- (void) callFooWithArray: (NSArray *) inputArray { [self fooFirstInput: [inputArray objectAtIndex:0] secondInput: [inputArray objectAtIndex:1]]; } - (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second { }
dan menyebutnya dengan:
[self performSelector:@selector(callFooWithArray) withObject:[NSArray arrayWithObjects:@"first", @"second", nil] afterDelay:15.0];
sumber
Anda dapat menemukan semua jenis metode performSelector: yang disediakan di sini:
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html
Ada banyak variasi tetapi tidak ada versi yang membutuhkan banyak objek sekaligus penundaan. Anda harus menyelesaikan argumen Anda dalam NSArray atau NSDictionary.
- performSelector: - performSelector:withObject: - performSelector:withObject:withObject: – performSelector:withObject:afterDelay: – performSelector:withObject:afterDelay:inModes: – performSelectorOnMainThread:withObject:waitUntilDone: – performSelectorOnMainThread:withObject:waitUntilDone:modes: – performSelector:onThread:withObject:waitUntilDone: – performSelector:onThread:withObject:waitUntilDone:modes: – performSelectorInBackground:withObject:
sumber
Saya tidak suka cara NSInvocation, terlalu rumit. Jaga agar tetap sederhana dan bersih:
// Assume we have these variables id target, SEL aSelector, id parameter1, id parameter2; // Get the method IMP, method is a function pointer here. id (*method)(id, SEL, id, id) = (void *)[target methodForSelector:aSelector]; // IMP is just a C function, so we can call it directly. id returnValue = method(target, aSelector, parameter1, parameter2);
sumber
Saya baru saja melakukan beberapa desas-desus dan perlu memanggil metode asli. Apa yang saya lakukan adalah membuat protokol dan memasukkan objek saya ke dalamnya. Cara lain adalah dengan mendefinisikan metode dalam sebuah kategori, tetapi akan membutuhkan penekanan peringatan (#pragma clang diagnostic diabaikan "-Wincomplete-Implementation").
sumber
Cara sederhana dan dapat digunakan kembali adalah dengan memperluas
NSObject
dan menerapkan- (void)performSelector:(SEL)aSelector withObjects:(NSArray *)arguments;
sesuatu seperti:
- (void)performSelector:(SEL)aSelector withObjects:(NSArray *)arguments { NSMethodSignature *signature = [self methodSignatureForSelector: aSelector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: signature]; [invocation setSelector: aSelector]; int index = 2; //0 and 1 reserved for (NSObject *argument in arguments) { [invocation setArgument: &argument atIndex: index]; index ++; } [invocation invokeWithTarget: self]; }
sumber
Saya hanya akan membuat objek khusus yang menampung semua parameter saya sebagai properti, dan kemudian menggunakan objek tunggal itu sebagai parameter
sumber