ios - 方法内部的 block 不返回

标签 ios objective-c facebook

我必须遵循以下方法。

如果用户喜欢该页面,我希望此方法返回 1,如果用户不喜欢该页面,则返回 0。但似乎该 block 是在该函数之前调用的。

有办法解决这个问题吗?

谢谢!

-(NSInteger) userWithId:(NSString *)fb_id likesPageWithID:(NSString *)page_id {

    __block NSInteger returnValue;
    NSString *fbGraphPath = [NSString stringWithFormat:@"/%@/likes/%@",fb_id,page_id];
    NSLog(@"%@",fbGraphPath);
    [FBRequestConnection startWithGraphPath:fbGraphPath parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        NSLog(@"%@",result);
        if(error) {
            NSLog(@"%@",error);
        } else {
            if([result count] == 0) {
                NSLog(@"%@",[result objectForKey:@"data"]);
                returnValue = 0;

            } else {
                    NSLog(@"%@",[result objectForKey:@"data"]);

                returnValue = 1;

                }
            }
    }];
    return returnValue;
}

最佳答案

我可以想到三种方法来做到这一点:

通知中心

就像 Apurv 答案所建议的那样,您可以使用通知中心来广播结果:

- (void)userWithId:(NSString *)fb_id likesPageWithID:(NSString *)page_id {

    __block NSInteger returnValue;
    NSString *fbGraphPath = [NSString stringWithFormat:@"/%@/likes/%@",fb_id,page_id];
    NSLog(@"%@",fbGraphPath);
    [FBRequestConnection startWithGraphPath:fbGraphPath parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        NSLog(@"%@",result);
        if(error) {
            NSLog(@"%@",error);
        } else {
            if([result count] == 0) {
                NSLog(@"%@",[result objectForKey:@"data"]);
                returnValue = 0;

            } else {
                    NSLog(@"%@",[result objectForKey:@"data"]);

                returnValue = 1;

                }
            }
        [[NSNotificationCenter defaultCenter] postNotificationName:@"mynotif" object:nil userInfo:@{@"result":@(returnValue)}];
    }];
}

就我个人而言,除非需要广播该值,否则我不会这样做。使用通知会增加一些不必要的开销。

条件

这是最简单的实现方式,并且不会改变你使用此方法的对象,但有点大材小用。

- (NSInteger)userWithId:(NSString *)fb_id likesPageWithID:(NSString *)page_id {

    __block NSInteger returnValue;
    NSCondition *condition = [NSCondition new];
    [condition lock];
    NSString *fbGraphPath = [NSString stringWithFormat:@"/%@/likes/%@",fb_id,page_id];
    NSLog(@"%@",fbGraphPath);
    [FBRequestConnection startWithGraphPath:fbGraphPath parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        NSLog(@"%@",result);
        if(error) {
            NSLog(@"%@",error);
        } else {
            if([result count] == 0) {
                NSLog(@"%@",[result objectForKey:@"data"]);
                returnValue = 0;

            } else {
                    NSLog(@"%@",[result objectForKey:@"data"]);

                returnValue = 1;

                }
            }
        [condition lock];
        [condition signal];
        [condition unlock];
    }];
    [condition wait];
    [condition unlock];
}

此外,此代码将阻塞正在运行的线程。因此,调用此方法的线程不能与运行 FB 完成处理程序的线程相同。

block

在我看来,这是最好的。

- (void)userWithId:(NSString *)fb_id likesPageWithID:(NSString *)page_id withCompletionHandler:(void (^)(NSInteger))handler {

    __block NSInteger returnValue;
    NSString *fbGraphPath = [NSString stringWithFormat:@"/%@/likes/%@",fb_id,page_id];
    NSLog(@"%@",fbGraphPath);
    [FBRequestConnection startWithGraphPath:fbGraphPath parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        NSLog(@"%@",result);
        if(error) {
            NSLog(@"%@",error);
        } else {
            if([result count] == 0) {
                NSLog(@"%@",[result objectForKey:@"data"]);
                returnValue = 0;

            } else {
                    NSLog(@"%@",[result objectForKey:@"data"]);

                returnValue = 1;

                }
            }
        handler(returnValue);
    }];
}

使用它很容易:

[var userWithId:fb_id likesPageWithID:page_id withCompletionHandler:^(NSInteger result) {
    // use result for whatever you need
}];

希望有帮助。

关于ios - 方法内部的 block 不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24032660/

相关文章:

iphone - 如何处理带有文本字段的 UItableViewCell 事件(内部触摸/外部触摸)?

objective-c - Obj-C 非空函数返回给 Swift 的是什么?

facebook - 有谁知道这个 "every SIM card has a name"是如何/为什么起作用的?

android - 如何检测是否在 Flutter 中打开了另一个应用程序?

ios - 无法在 iOS 项目中使用库,该库在具有相同设置的另一个项目中工作

ios - 谓词为零,nscoredata,目标

facebook - React-native FacebookSDK 显示为带有红色边框的空框

iphone - iOS 上的 Facebook FBConnect SDK 问题

ios - 关于隐式转换丢失整数精度的警告

iOS:AVCaptureDevicePosition,如何从 SCRecorder 获取(错误:Bad receiver type)