私の現在のヘッド スクラッチャー: Rails アプリケーションへのサービス呼び出し専用のモデル クラスを実装しています。
シナリオは次のとおりです。
- NSObject のサブクラスであるServiceという名前のクラスがあります。
- 実装ファイルにはいくつかのメソッドが定義されています… doSignUpを見てみましょう。
- AFNetworkingを使用して API と通信しています。
- SignUpViewControllerからServiceクラスのインスタンスを作成し、 doSignUpを呼び出します。
- メソッドは期待どおりに機能し、サーバーから適切な応答を受け取ります。
今、私が完全に理解していない部分が来ます:
- AFNetworkingは、サービス呼び出しにブロックを利用します。
- 成功ブロック内で、handleSignUpというヘルパー メソッドを呼び出します(これもServiceクラスにあります)。このメソッドは本質的に JSON を解析し、そこから新しいUser (NSObject サブクラス) を作成します。次に、handSignUpメソッドはUserオブジェクトを返します。
この時点で、新しいUserオブジェクトができたので、そのオブジェクトをSignUpViewControllerに送り返す必要があります。どうすればよいですか?
- そのオブジェクトを AppDelegate に追加して、SignUpViewControllerからアクセスする必要がありますか? このソリューションは、さまざまなグローバル プロパティにアクセスするために機能する可能性がありますが、SignUpViewController はいつ アクセスすべきかを知るのでしょうか?
- ServiceクラスにSignUpViewControllerへの参照を追加する必要がありますか? それは逆効果のようです... doSignUp メソッドとhandSignUpメソッドを SignUpViewControllerに追加することもできます。私のServiceクラスは他のviewControllerを認識してはいけないようです。
私のコード例については、以下を参照してください。
Service.h
//Service.h
#import <UIKit/UIKit.h>
#import "AFNetworking.h"
@interface Services : NSObject
- (void) doSignUp:(NSMutableDictionary*)params;
@end
Service.m
// Service.m
#import "Services.h"
#import "Config.h"
@implementation Services
- (void) doSignUp:(NSMutableDictionary*)params {
NSURL *url = [NSURL URLWithString:@"http://MYURL.COM"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSURLRequest *request = [httpClient requestWithMethod:@"POST" path:@"signup.json" parameters:params];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
[self handleSignUp:JSON];
} failure:nil];
[operation start];
}
- (User*) handleSignUp:(NSMutableArray*)json {
User * user = nil;
if ([[json valueForKey:@"success"] isEqualToString:@"true"]) {
// create user here ...
}
return user;
}
SignUpViewController.h
#import "Service.h"
@interface SignUpViewController : UIViewController {
Service * service;
}
@property (nonatomic, strong) Service * service;
SignUpViewController.m
#import "SignUpViewController.h"
@interface SignUpViewController ()
@end
@implementation SignUpViewController
@synthesize service = __service;
- (IBAction) initSignUp:(id)sender {
// create params...
[self.service doSignUp:params];
}
繰り返しますが、このコードはすべて本来の目的を果たします...すべての通信方法を知る必要があるだけです。handleSignUpが呼び出され、新しいUserオブジェクトが使用可能になったことをSignUpViewControllerに通知するにはどうすればよいですか?
お時間をありがとう、アンドレ