iOS- 새로운 인수와 afterDelay를 사용하여 performSelector를 구현하는 방법은 무엇입니까?
저는 iOS입니다. 다음과 같은 선택기 방법이 있습니다.
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second
{
}
나는 이와 같은 것을 구현합니다.
[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second" afterDelay:15.0];
그러나 그것은 나에게 다음과 같은 오류를 준다.
Instance method -performSelector:withObject:withObject:afterDelay: not found
내가 놓친 것에 대한 아이디어가 있습니까?
개인적으로 귀하의 요구에 더 가까운 해결책은 NSInvocation을 사용하는 것을 생각합니다.
다음과 같은 작업을 수행합니다.
indexPath 와 dataSource 는 동일한 메서드로 정의 된 두 개의 인스턴스 변수입니다.
SEL aSelector = NSSelectorFromString(@"dropDownSelectedRow:withDataSource:");
if([dropDownDelegate respondsToSelector:aSelector]) {
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[dropDownDelegate methodSignatureForSelector:aSelector]];
[inv setSelector:aSelector];
[inv setTarget:dropDownDelegate];
[inv setArgument:&(indexPath) atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
[inv setArgument:&(dataSource) atIndex:3]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
[inv invoke];
}
[NSObject performSelector:withObject:withObject:afterDelay:]
방법 과 같은 것이 있기 때문입니다 .
보내려는 데이터를 단일 Objective C 개체 (예 : NSArray, NSDictionary, 일부 사용자 지정 Objective C 유형)로 캡슐화 한 다음 [NSObject performSelector:withObject:afterDelay:]
잘되고있는 사랑받는 방법을 통해 전달해야합니다 .
예를 들면 :
NSArray * arrayOfThingsIWantToPassAlong =
[NSArray arrayWithObjects: @"first", @"second", nil];
[self performSelector:@selector(fooFirstInput:)
withObject:arrayOfThingsIWantToPassAlong
afterDelay:15.0];
매개 변수를 하나의 객체로 패키징하고 헬퍼 메서드를 사용하여 Michael과 다른 사람들이 제안한대로 원래 메서드를 호출 할 수 있습니다.
또 다른 옵션은 dispatch_after로 블록을 가져오고 특정 시간에 포함습니다.
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];
});
또는 이미 발견했듯이 지연이 필요하지 않습니다. - performSelector:withObject:withObject:
추론 간단한 옵션은 NSArray
또는 같은 두 인수를 모두 포함하는 one-매개 변수를 취하도록 메소드를 수정하는을 구석으로입니다 NSDictionary
(또는 one-매개 변수를 취하고 압축을 풀고 첫-th 메소드를 호출 한 다음 두-th 메소드 를 호출하는 두-th 메소드 를 추가하거나 지연).
예를 들어, 다음과 같은 것이 있습니다.
- (void) fooOneInput:(NSDictionary*) params {
NSString* param1 = [params objectForKey:@"firstParam"];
NSString* param2 = [params objectForKey:@"secondParam"];
[self fooFirstInput:param1 secondInput:param2];
}
그런 다음 다음을 수행하십시오.
[self performSelector:@selector(fooOneInput:)
withObject:[NSDictionary dictionaryWithObjectsAndKeys: @"first", @"firstParam", @"second", @"secondParam", nil]
afterDelay:15.0];
- (void) callFooWithArray: (NSArray *) inputArray
{
[self fooFirstInput: [inputArray objectAtIndex:0] secondInput: [inputArray objectAtIndex:1]];
}
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second
{
}
다음과 같이 호출하십시오.
[self performSelector:@selector(callFooWithArray) withObject:[NSArray arrayWithObjects:@"first", @"second", nil] afterDelay:15.0];
performSelector : 메소드의 모든 유형은 여기에서 수 있습니다.
많은 변형이 있지만 지연뿐만 아니라 여러 객체를 취하는 버전은 없습니다. 대신 NSArray 또는 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:
나는 너무 복잡한 NSInvocation 방식을 싫어합니다. 간단하고 깔끔하게 유지합시다.
// 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);
방금 약간의 혼란을 겪었고 원래 메서드를 호출해야했습니다. 내가 한 일은 프로토콜을 만들고 그것에 내 물건을 던지는 것이었다. 또 다른 방법은 카테고리에서 메소드를 정의하는 것이지만 경고를 억제해야합니다 (#pragma clang diagnostic은 "-Wincomplete-implementation"을 무시 함).
간단하고 재사용 가능한 방법은 확장 NSObject
하고 구현하는 것입니다.
- (void)performSelector:(SEL)aSelector withObjects:(NSArray *)arguments;
같은 것 :
- (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];
}
모든 매개 변수를 속성으로 포함하는 사용자 지정 개체를 만든 다음 해당 단일 개체를 매개 변수로 사용합니다.
'IT' 카테고리의 다른 글
axios에서 헤더 및 옵션을 설정하는 방법은 무엇입니까? (0) | 2020.09.06 |
---|---|
Xcode- 다운로드 할 수있는 dSYM이 없습니다. (0) | 2020.09.06 |
반응의 상태 배열에서 항목 삭제 (0) | 2020.09.06 |
AngularJS와 함께 부트 도구 설명 사용 (0) | 2020.09.06 |
PHP를 사용하여 동적으로 QR 코드 생성 (0) | 2020.09.06 |