如何在ios的另一个类中获取NSDictionary JSON数据



我是iPhone编程新手。我在ClassA中创建了一个方法调用normallogin,但是我在ClassB中调用这个方法,如果调用这个方法,它将与服务器连接,并在ClassA的didFinishLoading方法中从服务器获取JSON数据,我已经存储在新的JSON对象中。现在我想获得新的JSON对象在类b新的NSDictionary对象。

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
 NSString * returnString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSLog(@"%@returnStringreturnString", returnString);
  NSDictionary *newJSON = [NSJSONSerialization JSONObjectWithData:responseData
                                                            options:0
                                                              error:nil];
  NSLog(@"%@newJSON:---", newJSON);
}

如何在类b中获取新的JSON对象数据。为此,我使用下面的代码我使用下面的代码在类b中调用normallogin方法。一切正常。但我想在ClassB中获得新的JSON数据。请告诉我如何获取数据。

loginconnectiomm *lconnection =[[loginconnectiomm alloc]init];
 [lconnection normallogin];

我可以想到两种方法来实现你所要求的,但可能还有更多。

1)使用委托

设置ObjectB为ObjectA的委托。基本上它是a的弱实例变量它遵循协议。因此,在ClassA.h文件中定义(在ClassA的接口块之前):

@class ClassA;    // The interface of ClassA is defined later, so we need to assure that ClassA exists ("forward declaration").
@protocol ClassADelegate <NSObject>
-(void)objectA:(ClassA*)objectA didFinishLoading:(NSDictionary*)dict;
@end

然后你可以这样修改你的代码(我省略了日志):

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSString * returnString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSDictionary *newJSON = [NSJSONSerialization JSONObjectWithData:responseData
                                                        options:0
                                                          error:nil];
    if ([self.delegate respondsToSelector:@selector(objectA:didFinishLoading:)])
    {
        [self.delegate objectA:self didFinishLoading:newJSON];
    }
}

2)使用block

你可以传入在connectionDidFinishLoading:中执行的代码块。因此,在ClassA中为块定义一个属性:

@property (nonatomic, copy) void(^didFinishLoadingHandler)(NSDictionary*);

添加
self.didFinishLoadingHandler(newJSON);
self.didFinishLoadingHandler = nil;

didFinishLoading的底部。这将执行block并重置属性。

normallogin中存储传入块的属性。在ObjectB中执行如下操作:

__block NSDictionary* jsonDict = nil;
loginconnectiomm *lconnection =[[loginconnectiomm alloc]init];
[lconnection normallogin:^(NSDictionary* json){
    jsonDict = json;
}];

-(void)normallogin;的声明改为-(void)normallogin:(void(^)(NSDictionary*))didFinishLoadingHandler;。然后在实现中输入

-(void)normallogin:(void(^)(NSDictionary*))didFinishLoadingHandler
{
    self.didFinishLoadingHandler = didFinishLoadingHandler;
    // Rest of the stuff from your normallogin
    // ...
}

您可以创建一个类来表示解析JSON响应后获得的数据。添加一个singleton class,它将允许从任何视图控制器访问该类的对象。

您需要创建一个可以提供返回值的返回类型函数。像这样

-(NSDictionary *) normallogin{
NSDictionary *newJSON = [NSJSONSerialization JSONObjectWithData:responseData options:0   error:nil];
 //Note : Here I write down this dictionary only for example .. Please implement your code here and that dictionary you are getting return this . 
return newJSON;
}

然后调用这个函数,像这样返回字典

loginconnectiomm *lconnection =[[loginconnectiomm alloc]init];
 NSDictionary *returnDic = [lconnection normallogin];

现在可以对数据

使用returnDic了

这可以使用委托实现。你的类B必须确认一个协议,比如RespondeDelegate。

@Protocol ResponseDelegate<NSObject> 
-(Void)workWithJsonResponse:(NSDictionary *)response;
@end

在ClassA.h中创建如下属性

@property (nonatomic,strong) id<ResponseDelegate> delegate;

在类a.m.文件中合成委托属性

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{NSString * returnString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSDictionary *newJSON = [NSJSONSerialization JSONObjectWithData:responseData
                                                        options:0
                                                          error:nil];
ClassB *obj = [[ClassB alloc] init]; // initialize your obj as per your convenience
obj.delegate = self;
[obj.delegate workWithJsonResponse:newJSON];

在ClassB.h文件

中执行此操作
@Interface ClassB:UIViewController<ResponseDelegate>
在ClassB

。M文件句柄/实现委托方法

-(Void)workWithJsonResponse:(NSDictionary *)response {
//DO the stuff here
}

希望这对你有用。如果有任何问题请告诉我。

最新更新