0

我的 SendData 类中有以下 retrieveData 方法。我从我的 MovieViewController 调用这个类。该方法检查从服务器获取的数据是否正确,如果正确,则返回 TRUE。如果不是,则返回 FALSE。它工作得很好,只是该方法在数据有时间“下载”之前返回到我的 MovieViewController。因此,该方法始终返回 false,因为它始终为 null,因为控制权返回给原始视图控制器。

仅当数据完成加载而不是之前,我如何返回(AKA 使用返回值的方法退出)?

谢谢!

发送数据.m

-(BOOL)retrieveData:(NSString *) postID:(NSString *) message:(NSString *)token
{

    __block BOOL value=FALSE;
    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    sessionConfiguration.HTTPAdditionalHeaders = @{
                                                   @"message" : message,
                                                   @"access_token": token
                                                   };

    postID=[NSString stringWithFormat:@"https://graph.facebook.com/%@/comments?message=%@&access_token=%@",postID,message,token];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:postID]];
    request.HTTPMethod = @"POST";
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        //THIS NEEDS TO BE EXECUTED BEFORE THE METHOD IS RETURNED
        BOOL valid;
        NSString* myString;
        myString = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
        NSLog(@"MY string is %@", myString);

        if (myString != NULL || [myString length] != 0)
        {
            valid = TRUE;
        }
        else
        {
            valid = FALSE;
        }
        value=valid;
    }];
    return value;

}
4

2 回答 2

1

您可以使用委托模式来做到这一点。您必须将以下属性添加到SendData

@property (nonatomic, weak) id delegate;

和方法:

- (void)dataDownloaded:(NSNumber *)result

MovieViewController.

然后MovieViewController你必须设置(我在这里假设 sendData 是 SendData 类的对象):

sendData.delegate = self;

然后您必须将定义更改为:

-(void)retrieveData:(NSString *) postID:(NSString *) message:(NSString *)token
{
    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    sessionConfiguration.HTTPAdditionalHeaders = @{
                                                   @"message" : message,
                                                   @"access_token": token
                                                   };

    postID=[NSString stringWithFormat:@"https://graph.facebook.com/%@/comments?message=%@&access_token=%@",postID,message,token];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:postID]];
    request.HTTPMethod = @"POST";
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        //THIS NEEDS TO BE EXECUTED BEFORE THE METHOD IS RETURNED
        BOOL valid;
        NSString* myString;
        myString = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
        NSLog(@"MY string is %@", myString);

        if (myString != NULL || [myString length] != 0)
        {
            valid = TRUE;
        }
        else
        {
            valid = FALSE;
        }

        [self.delegate performSelectorOnMainThread:@selector(dataDownloaded:) withObject:@(valid) waitUntilDone:NO];
    }];
}

您还可以检查是否self.delegate响应dataDownloaded:

[self.delegate respondsToSelector:@selector(dataDownloaded:)] 

或者,您可以使用块或NSNotificationCenter.

于 2013-10-10T14:58:31.543 回答
0

这可以通过 NSURLConnection 完成,但不要在主线程上运行它,否则在等待请求完成时您很有可能会冻结应用程序数分钟:

NSError *error = nil;
NSURLResponse *response = nil;
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:postID]];
request.HTTPMethod = @"POST";
[request addValue:message forHTTPHeaderField:@"message"];
[request addValue:token forHTTPHeaderField:@"access_token"];
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *myString = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
于 2013-10-10T15:00:19.997 回答