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

标签 ios iphone objective-c

我是 iPhone 编程的新手。我在 ClassA 中创建了一个调用 normallogin 的方法。但是如果调用此方法,我将在 ClassB 中调用此方法,它将连接服务器并从 didFinishLoading 中的服务器获取 JSON 数据。 classA 中的方法,我已经存储在新的 JSON 对象中。现在我想在 classB 中获取新的 JSON 对象 new 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);
}

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

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

最佳答案

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

1) 使用委托(delegate)

将对象 B 设置为对象 A 的委托(delegate)。基本上它是 A 的弱实例变量并且它符合协议(protocol)。因此在您的 ClassA.h 文件中定义(在 ClassA 的接口(interface) block 之前):

@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 中为 block 定义一个属性:

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

添加

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

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

normallogin 中,将传入的 block 存储在属性中。在 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
    // ...
}

关于ios - 如何在ios中的另一个类中获取NSDictionary JSON数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23752360/

相关文章:

iOS:色域与 UIStackView 的轴有什么关系?

IOS swift 如何使用 UIActivityViewController 共享图像和文本

ios - 无法读取数据,因为它的格式不正确。”

ios - Objective-C:从大型数据结构中有效地删除重复项

ios - 按下后退按钮时,上一个屏幕上的导航标题消失

ios - Xcode 更新到 7.2 但仍然只显示 7.1

ios - 如何在 ios 中使用 nexmo 向多个号码发送短信?

iPhone/iOS 如何在多个文件夹中加载大量图像并在表格 View 中显示?

iphone - 使用iOS6在Facebook的Xcode 4.5中从Facebook获取用户详细信息

iphone - 如何检测设备方向与界面方向不同?