0

だから私は次のようなコードを持っています:

@interface RequestHandler()

@property (nonatomic) NSInteger statusCode;

@end

@implementation RequestHandler

- (bool)sendRequest:(NSString *)surveyorId withData:(NSData *)requestData
{
    [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:true];

    if (self.statusCode == 200)
    {
        return YES;
    }

    return NO;
}

明らかに、ルーチンはif-elseリクエストが終了する前にステートメントに進みます。したがって、チェックされる前にself.statusCodeデリゲートに正しく設定されません。didReceiveResponseこれを行う最良の方法は何ですか?

bool設定される別のプロパティを追加しconnectionDidFinishLoadingて、このプロパティが設定されるまでループすることを考えています。それが完了すると、チェックされself.statusCodeます。しかし、これはスレッドをブロックすると思いますか?sendSynchronousRequest権利と変わらないのでは?バックグラウンドスレッドに入れずにこれを行う方法はありますか?

4

4 に答える 4

1

sendRequest:withData:メソッドが成功/失敗を示す BOOL を返す代わりにRequestHandler、デリゲートを使用することをお勧めします。次に、メソッドからこの情報を返そうとするのではなく、非同期リクエストが終了したときに、デリゲートに成功/失敗/その他のことを知らせることができsendRequest:withData:ます (お気づきのように、うまく機能しません)。

したがって、デリゲート プロトコルを次のように定義できます (例として、これらにさらに情報を含めることをお勧めします)。

@protocol RequestHandlerDelegate <NSObject>

- (void)requestHandlerSuccessfullyCompletedRequest:(RequestHandler *)sender;
- (void)requestHandlerFailedToCompletedRequest:(RequestHandler *)sender;

@end

次に、このプロトコルに準拠するもののデリゲート プロパティを RequestHandler に与えます。

@property (nonatomic, weak) id<RequestHandlerDelegate> delegate;

(デリゲートとして何かを設定していることを確認してください!)

次に、非同期リクエストが完了すると、次のような適切なメッセージをデリゲートに送信できます。

[self.delegate requestHandlerSuccessfullyCompletedRequest:self];

NSURLConnectionでデリゲート メソッドを実装する必要がありRequestHandlerます (コードから、既に行っていると思います)。または、iOS 7 以降をターゲットにしている場合は、NSURLSession代わりに を参照してください。

于 2014-08-07T10:52:32.773 に答える
0

デリゲート メソッドで NSURLConnection を使用する代わりにNSURLConnection sendAsynchronousRequest、コードでブロックを使用できます。この例では、接続エラーを確認し、ステータス コードを比較できます。

NSURL *URL = [NSURL URLWithString:@"http://yourURLHere.com"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:URL];

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *rspreportStatus, NSData *datareportStatus, NSError *e)
{

    NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)rspreportStatus;
    int code = [httpResponse statusCode];

    if (e == nil && code == 200)
    {
        // SUCCESS
    } else {
        // NOT SUCCESS
    }
}];
于 2014-08-07T12:34:41.987 に答える
-1

この returnString をログに記録して確認することもできます。

        NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
        NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
        NSArray *arrpicResult = [returnString JSONValue];
于 2014-08-07T10:13:16.520 に答える