我是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];
现在可以对数据
这可以使用委托实现。你的类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
}
希望这对你有用。如果有任何问题请告诉我。