0

AFHTTPClientを使用してjsonを解析するためにAFNetworkingライブラリを使用しています。jsonがクライアントブロック内で解析されていることを確認し、そのデータをjsonモデルに送信できます。ただし、ブロックの外側からjsonモデルにアクセスしようとすると、データが取得されません。解析したjsonデータをjsonモデルに渡して、アプリの他の場所でそのモデルデータにアクセスするにはどうすればよいですか?

AFHTTPClientサブクラス/シングルトン:

#import <Foundation/Foundation.h>
#import "AFHTTPClient.h"

@interface JsonClient : AFHTTPClient

+ (JsonClient *)sharedClient;

@end

#import "JsonClient.h"
#import "AFJSONRequestOperation.h"

static NSString *const kJsonBaseURLString = @"https://alpha-api.app.net/";

@implementation JsonClient

+ (JsonClient *)sharedClient {
    static JsonClient *_sharedClient = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedClient = [[JsonClient alloc] initWithBaseURL:[NSURL URLWithString:kJsonBaseURLString]];
    });

    return _sharedClient;
}

- (id)initWithBaseURL:(NSURL *)url {
    self = [super initWithBaseURL:url];

    if (!self) {
        return nil;
    }

    [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
    [self setDefaultHeader:@"Accept" value:@"application/json"];

    return self;
}

@end

JSONモデルデータ:

#import <Foundation/Foundation.h>

@interface TheJson : NSObject

@property (nonatomic, copy) NSString *createdAt;
@property (nonatomic, copy) NSString *userText;

- (id)initWithDictionary:(NSDictionary *)dict;

@end

#import "TheJson.h"

@implementation TheJson

- (id)initWithDictionary:(NSDictionary *)dict {
    self = [super init];

    if (self) {
        self.createdAt = [dict objectForKey:@"created_at"];
        self.userText = [dict objectForKey:@"text"];
    }

    return self;
}

@end

ユーザーインターフェイスを更新するためのViewController:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end

#import "ViewController.h"
#import "JsonClient.h"
#import "TheJson.h"

@interface ViewController ()

@property (weak) IBOutlet UILabel *createdLabel;
@property (weak) IBOutlet UILabel *textLabel;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (IBAction)fetchJsonData:(id)sender {

    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

    [[JsonClient sharedClient] getPath:@"stream/0/posts/stream/global" parameters:nil
                               success:^(AFHTTPRequestOperation *operation, id JSON) {
                                   NSArray *postsFromResponse = [JSON valueForKeyPath:@"data"];
                                   NSDictionary *dictFromArray = postsFromResponse[0];

                                   TheJson *jsonObject = [[TheJson alloc] initWithDictionary:dictFromArray];
                                   NSLog(@"createdAt is %@", jsonObject.createdAt);
                                   NSLog(@"text from user is %@", jsonObject.userText);

                                   [self updateInterface];
                                   [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

                               } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                   NSLog(@"Error is %@", [error description]);
                               }
     ];
}

- (void)updateInterface {
    TheJson *thejson;
    [_createdLabel setText:thejson.createdAt];
    [_textLabel setText:thejson.userText];
}

@end
4

1 に答える 1

2

新しいjsonObjectをブロックから渡したり、どこにも保存したりしていません。短期的な答えはupdateInterface、jsonObjectをパラメーターとして受け取ることを宣言することです。

したがって、あなたは次のようにupdateInterfaceなります。updateInterface:

- (void)updateInterface:(TheJson*)thejson {
    [_createdLabel setText:thejson.createdAt];
    [_textLabel setText:thejson.userText];
}

...そして、ブロック内で、次のようにこのメソッドを呼び出します。

[self updateInterface:jsonObject];

長期的には、アプリにこれらのオブジェクトの多くが含まれている場合や、オブジェクトを一定期間保持する必要がある場合は、ダウンロード時にこれらのオブジェクトをどのように保存および整理するかを検討する必要があります。

于 2013-03-22T21:09:09.127 に答える