【问题标题】:multiple return values in callback blocks回调块中的多个返回值
【发布时间】:2015-06-11 14:34:53
【问题描述】:

与我一起工作的人不想使用委托方法有几个原因,他们希望我想出一个解决方案;

基本上他们想要一个带有多个返回值的回调块,当第一个返回值到达时,块仍然应该等待即将到来的返回值

类似

[parserobject parsefile:file withCallback {
                if (started) {
                    //file parsing started 
                    //this should get executed first
                }
                //if file parsing succesfully started also check if it 
                //succesfully finished or failed in the same callback
                if (finished) {
                    //file parsing finished 
                }

                if(failed)
                {
                    //this represents if parsing failed any time from start to finish
                    //if so exit the callback

                }
            }];

我见过有人使用structsnsintegers 来返回不同的值,但通常只返回一个结果......

上面的代码块可以用objective-c编写吗?

【问题讨论】:

  • 您想收到每次更新的通知吗?
  • 是的,但在同一个回调函数中
  • 你试过NSNotification吗?
  • 我会创建一个块,只要内部状态发生变化,它就会被 parsefile 调用。将状态作为参数传递给块。即 block(PARSE_STARTED), block(PARSE_FINISHED), block(PARSE_FAILED)... FINISHED 或 FAILED 表示两种方式都已完成。

标签: ios objective-c callback block


【解决方案1】:

这是你的功能

typedef void(^VOIDCALLBACK)(void); //Just a type here
typedef void(^BOLLCALLBACK)(bool succeed);//Just a type here
-(void)parserobjectWithFile:(NSString *)file StartCallBack:(VOIDCALLBACK) startCallBack completionBlock:(BOLLCALLBACK) completion{
    // When start
 dispatch_async(dispatch_get_main_queue(), ^{
     startCallBack();//Make call back run in main queue
   });
    //When finisehd set succeed to yes,otherwise set to no
    BOOL succeed = YES;//Pass in to indicator if succeed
  dispatch_async(dispatch_get_main_queue(), ^{
    completion(succeed); //Make call back run in main queue
});
}

那你就这样称呼它

   [self parserobjectWithFile:@""
             StartCallBack:^{
                 //Here task is start
             }
           completionBlock:^(bool succeed) {
                //Here task is done.Check succeed to figure out if succeed
           }];

一个简单的例子

这是函数部分

@implementation ViewController

-(void)viewDidAppear:(BOOL)animated{
 [self parserobjectWithFile:@"" StartCallBack:^{
  NSLog(@"start");
 } completionBlock:^(bool succeed) {
   NSLog(@"finished");
 }];
}


typedef void(^VOIDCALLBACK)(void); //Just a type here
typedef void(^BOLLCALLBACK)(bool succeed);//Just a type here
-(void)parserobjectWithFile:(NSString *)file StartCallBack:   (VOIDCALLBACK) startCallBack completionBlock:(BOLLCALLBACK) completion{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //Start
    dispatch_async(dispatch_get_main_queue(), ^{
        startCallBack();//Make call back run in main queue
    });
    sleep(2.0);
    BOOL succeed = YES;//Pass in to indicator if succeed
    dispatch_async(dispatch_get_main_queue(), ^{
        completion(succeed); //Make call back run in main queue
    });
});    
}
@end

这将输出

2015-06-11 23:39:25.426 OCTest[767:144615] start
2015-06-11 23:39:27.426 OCTest[767:144615] finished

【讨论】:

  • 嗯是的解析在后台队列中,我不完全理解你说的部分you can do this to let your callBack run on main thread所以回调函数调用typedef void(^VOIDCALLBACK)(void);typedef void(^BOLLCALLBACK)(bool succeed);应该循环运行所以他们永远不会被释放?
  • 那不是调用函数,typedef void(^VOIDCALLBACK)(void)只是NSObject,NSNumber之类的类型。回调块完成后将被释放。
【解决方案2】:

可以编写一个块,根据目前达到的状态执行不同的操作。为了使它起作用,请使用 __block 修饰符声明代表块状态的变量:

__block BOOL started = NO;
__block BOOL finished = NO;
__block BOOL failed = NO;
[parserobject parsefile:file withCallback:^ {
    if (started) {
        //file parsing started 
        //this should get executed first
    } else {
        ...
        // Conditionally set started to YES
        started = YES;
    }
    //if file parsing succesfully started also check if it 
    //succesfully finished or failed in the same callback
    if (finished) {
        //file parsing finished 
    }
    if(failed) {
        //this represents if parsing failed any time from start to finish
        //if so exit the callback
    }
}];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2010-09-29
    • 2013-12-26
    相关资源
    最近更新 更多