【问题标题】:How return variable in main thread like as callback?如何像回调一样在主线程中返回变量?
【发布时间】:2016-01-13 10:47:57
【问题描述】:

我在Objective c中有以下方法:

- (BOOL) authorize {

    OauthObject* oauthObj = [OauthObject sharedManager];

    [[Manager sharedManagerServerRequest] authorize:(oauthObj) and:login.text withPassword:password.text completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        NSLog(@"%@", error);

        if(error == NULL && data != nil) { 
            self.requestSuccessfull = YES;

        } else {
            //NSLog(@"Error: %@", error);
            // Display error
        }
    }];

    return self.requestSuccessfull;
 }

在这个函数内部有一个方法authorize,它向服务器发出请求并以块的形式返回数据。

问题是 - (BOOL) authorize 返回更快 return self.requestSuccessfull 并且它总是 FALSE。

【问题讨论】:

  • 您缺少一些关于使用块进行异步开发的基础知识。你不能让调度队列返回,它有自己的范围。 @Abamazi

标签: objective-c ios7 xcode7


【解决方案1】:

此请求是异步的,因此您应该使用 block 进行回调。您可以将代码更改为:

 - (void)authorize:(void (^)(BOOL result))completionHanlder {
    OauthObject* oauthObj = [OauthObject sharedManager];

    [[Manager sharedManagerServerRequest] authorize:(oauthObj) and:login.text withPassword:password.text completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        NSLog(@"%@", error);

        if(error == NULL && data != nil) {
            completionHanlder(YES);

        } else {
            completionHanlder(NO);
            //NSLog(@"Error: %@", error);
            // Display error
        }
    }];
} 

你可以这样使用:

[yourInstance authorize:^(BOOL result) {
    //user result here.
}];

希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2011-08-04
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多