Objective-C에서 콜백을 수행하는 방법



Answers

완성을 위해, StackOverflow RSS가 나에게 무작위로 질문을 부활시키기 때문에 다른 (더 새로운) 옵션은 블록을 사용하는 것입니다 :

@interface MyClass: NSObject
{
    void (^_completionHandler)(int someParameter);
}

- (void) doSomethingWithCompletionHandler:(void(^)(int))handler;
@end


@implementation MyClass

- (void) doSomethingWithCompletionHandler:(void(^)(int))handler
{
    // NOTE: copying is very important if you'll call the callback asynchronously,
    // even with garbage collection!
    _completionHandler = [handler copy];

    // Do stuff, possibly asynchronously...
    int result = 5 + 3;

    // Call completion handler.
    _completionHandler(result);

    // Clean up.
    [_completionHandler release];
    _completionHandler = nil;
}

@end

...

MyClass *foo = [[MyClass alloc] init];
int x = 2;
[foo doSomethingWithCompletionHandler:^(int result){
    // Prints 10
    NSLog(@"%i", x + result);
}];
Question

Objective-C에서 콜백 함수를 수행하는 방법은 무엇입니까?

나는 몇 가지 완성 된 예제를보고 싶습니다. 그리고 나는 그것을 이해해야합니다.




이 질문을 최신으로 유지하기 위해 iOS 5.0의 ARC 도입은 Blocks 사용하여보다 간결하게 달성 할 수 있음을 의미합니다.

@interface Robot: NSObject
+ (void)sayHi:(void(^)(NSString *))callback;
@end

@implementation Robot
+ (void)sayHi:(void(^)(NSString *))callback {
    // Return a message to the callback
    callback(@"Hello to you too!");
}
@end

[Robot sayHi:^(NSString *reply){
  NSLog(@"%@", reply);
}];

Objective-C의 블록 구문을 잊어 버린 경우 항상 F **** ng Block Syntax 가 있습니다.




Links