1

私は以下を実装したいと思います:カスタムクラスを用意して(アプリの多くの部分から呼び出し/使用できるように) AFNetworking、サーバーにリクエストして応答を取得します。クラス内のコードは機能しますが、アプリの他の部分から呼び出すと、null 値が返されます。カスタムクラスのせいだと思います。とにかく、ここに私のコードがあります:

UDIDGen.h

#import <Foundation/NSString.h>
@interface NSString (UDIDGen)
+ (NSString *)getUDID;
@end

UDIDGen.m

#import "UDIDGen.h"
#import "AFHTTPClient.h"
#import "AFHTTPRequestOperation.h"

@implementation NSString (UDIDGen)

+ (NSString *)getUDID{
    __strong __block NSString *holder;

    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://domain.com/id.php"]];
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET"
                                                            path:@"http://domain.com/id.php"
                                                      parameters:nil];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        holder=[NSString stringWithFormat:@"%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]];
        NSLog(@"SERVER RESPONSE: %@",holder);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    }];
    [operation start];
    return holder;
}
@end

そして、アプリの他の部分から呼び出したいときは

#import "UDIDGen.h"

その後

 NSString *wsa=[NSString getUDID];
 NSLog(@"Response %@",wsa);

何らかの理由NSLog(@"SERVER RESPONSE: %@",holder);で動作し、サーバーの応答を nslog することができます。しかしNSString *wsa=[NSString getUDID];、私にヌル値を与えます。カスタムクラスを実装する方法に関係していると思いますが、何か間違っています。何か助けはありますか?

編集:私の作業コードなので、他の人がそれを使用します:

UDIDGen.h

#import <Foundation/NSString.h>
@interface UDIDGen:NSObject{

}
- (void)getUDIDWithCompletion:(void (^)(NSString *udid))completion;
@end

UDIDGen.m

#import "UDIDGen.h"
#import "AFHTTPClient.h"
#import "AFHTTPRequestOperation.h"

@implementation UDIDGen

- (void)getUDIDWithCompletion:(void (^)(NSString *udid))completion {
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://domain.com/id.php"]];
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET"
                                                            path:@"http://domain.com/id.php"
                                                      parameters:nil];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSString *udid=[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"SERVER RESPONSE: %@",udid);
        if (completion)
        {
            completion(udid);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //  TODO: Handle error
    }];
    [operation start];
}
@end

次のように使用します。

UDIDGen *getResponse = [[UDIDGen alloc] init];

    [getResponse getUDIDWithCompletion:^(NSString *udid) {
        NSLog(@"SERVER RESPONSE: %@",udid);
    }];
4

1 に答える 1

1

AFHTTPRequestOperation非同期で開始しています。これは、別の非ブロッキング スレッドで実行されていることを意味し、リクエストが完了する前にメソッドが返される可能性があります。

最も簡単な方法はこれを行うことですが、ロード中に GUI がブロックされる可能性が高くなります。

[operation startSynchronous];

最もクリーンな方法は、完了ブロックを使用するか、自分自身をデリゲートして、応答が受信されたときにターゲット クラスに通知することです。

+ (void)getUDIDWithCompletion:(void (^)(NSString *udid))completion {
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://domain.com/id.php"]];
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET"
                                                            path:@"http://domain.com/id.php"
                                                      parameters:nil];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSString *udid=[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"SERVER RESPONSE: %@",udid);
        if (completion)
        {
            completion(udid);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //  TODO: Handle error
    }];
    [operation start];
}

このメソッドを次のように呼び出します。

[YourCustomClass getUDIDWithCompletion:^(NSString *udid) {
   // use udid / update GUI
}];
于 2013-10-05T16:43:56.440 に答える