0

SendData クラスに次の retrieveData メソッドがあります。このクラスを MovieViewController から呼び出します。このメソッドは、サーバーから取得したデータが正しいかどうかをチェックし、正しい場合は TRUE を返します。そうでない場合は、FALSE を返します。データが「ダウンロード」される前に、メソッドが MovieViewController に戻ることを除いて、問題なく動作します。したがって、コントロールが元のView Controllerに返されるため、メソッドは常にnullであるため、メソッドは常にfalseを返します。

データの読み込みが完了したときにのみ戻る (戻り値を持つメソッドで別名を終了する) にはどうすればよいですか?

ありがとう!

SendData.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 に答える