0

私がやろうとしているのは、呼び出されたときにJsonDataのNSDictionaryを返すクラスを作成することです。私は過去に画像で同じことをしましたが、NSDictionaryでそれを実装する方法について少し混乱しています。

私がやりたいのは、ビューをロードしてから、バックグラウンドでリクエストを送信してJsonデータ(非同期)を取得し、使用するデータを含む辞書を返すことです。さまざまなビューで多くのJsonデータをロードするので、再利用可能なクラスにする必要があります。

- (id)initWithURL:(NSURL *)url
{
    self = [self init];

    if (self)
    {
        receivedData = [[NSMutableData alloc] init];
        [self loadWithURL:url];
    }

    return self;
}

- (void)loadWithURL:(NSURL *)url    
{
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:url]delegate:self];
    [connection start];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [receivedData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{

    NSError *error = nil;

    jsonReturn = [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&error];

}

ビューがアクセスできるプロトコルに結果を追加することを考えましたが、もっと簡単でクリーンな方法が必要ですか?次のようにNSdictionaryを返す方法はありますか?

NSDictionary * dictionary = [LoadURLJSon initWithURL:myurl];

そしてそれはNSDictionaryを取り戻しますか?

4

2 に答える 2

0

必要なのは、非同期 API (具体的には ) 上の同期操作です[NSURLConnection start]。重いスレッドジャグリングなしではそれを行うことはできません.とにかくそれは悪い考えです-非同期は本当に行く方法です. 非同期性を捨てないでください。

ワンショット非同期取得メソッドを実行する最善の方法は、URL、NSObjectセレクターをパラメーターとして受け取るメソッドを構築することです。リクエストが完了すると、NSDictionary をパラメーターとして指定して、前述のオブジェクトで前述のセレクターを呼び出します。 . これが、コールバックを行う Objective C の方法です。

このメソッドは、クラスを内部的にインスタンス化し、コールバック情報を渡し、リクエストを開始します。リクエストが完了し、JSON が NSDictionary に解析されたら[performSelector:]、 callbackを呼び出しますNSObject

結局、同期操作が必要な場合は、[NSURLConnection sendSynchronousRequest]ではなくを使用します[NSURLConnection start]

于 2012-06-16T02:09:30.643 に答える
0

これが私が最終的に得たものです!将来ここを通過する人に役立つはずです。

 #import <Foundation/Foundation.h>

@protocol LoadJsonDelegate <NSObject, NSURLConnectionDelegate>
@optional
- (void) downloadFinished;
- (void) downloadReceivedData;
- (void) dataDownloadFailed: (NSString *) reason;
@end

@interface LoadURLJson : NSObject
{
    NSMutableData *receivedData;
    int expectedLength;
}

@property (nonatomic, strong) NSMutableData *receivedData;
@property (strong) NSString *urlString;
@property (weak) id <LoadJsonDelegate> delegate;

-(void)start;
-(void)cancel;

+ (id)download:(NSString *)aURLString withDelegate:(id <LoadJsonDelegate>)aDelegate;

@end

彼ら

#import "LoadURLJson.h"
#define SAFE_PERFORM_WITH_ARG(THE_OBJECT, THE_SELECTOR, THE_ARG) (([THE_OBJECT respondsToSelector:THE_SELECTOR]) ? [THE_OBJECT performSelector:THE_SELECTOR withObject:THE_ARG] : nil)

@implementation LoadURLJson

@synthesize receivedData, delegate, urlString;

+ (id) download:(NSString *)aURLString withDelegate:(id <LoadJsonDelegate>)aDelegate
{
    if (!aURLString)
    {
        NSLog(@"Error. No URL string");
        return nil;
    }

    LoadURLJson *loadJson = [[self alloc] init];
    loadJson.urlString = aURLString;
    loadJson.delegate = aDelegate;
    [loadJson start];

    return loadJson;
}

-(void)start   
{
    receivedData = [NSMutableData data];
    NSURL *url = [NSURL URLWithString:urlString];

    NSURLConnection *connection = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:url]delegate:self];
    [connection start];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [receivedData setLength:0];

    // Check for bad connection
    expectedLength = [response expectedContentLength];
    if (expectedLength == NSURLResponseUnknownLength)
    {
        NSString *reason = [NSString stringWithFormat:@"Invalid URL [%@]", urlString];
        SAFE_PERFORM_WITH_ARG(delegate, @selector(dataDownloadFailed:), reason);
        [connection cancel];
        [self cleanup];
        return;
    }
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [receivedData appendData:data];
    SAFE_PERFORM_WITH_ARG(delegate, @selector(downloadReceivedData), nil);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    SAFE_PERFORM_WITH_ARG(delegate, @selector(downloadFinished), nil);
}

-(void)cleanup
{
    self.urlString = nil;
}

-(void)dealloc
{
    [self cleanup];
}

-(void)cancel
{
    [self cleanup];
}

@end

使用法 - yourView.h 内

#import "LoadURLJson.h"

@interface ViewController : UIViewController <LoadJsonDelegate>
{
    LoadURLJson *loadJson;
}

youView.m

電話:

loadJson = [LoadURLJson download:@"url" withDelegate:self];

次に実装

-(void)downloadFinished
{
    NSData *data = [[NSData alloc] initWithData:loadJson.receivedData];

    NSError *error = nil;
    NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error:&error];

    NSLog(@"%@",dictionary);
}

DownloadHelper に基づく: https://github.com/erica/iOS-5-Cookbook

BSD ライセンス。

于 2012-06-16T06:14:11.987 に答える