我有2节课。 A和B.在ClassA中我有一个方法可以检索JSON数据并添加到数组中。我想从ClassB访问此数组。我怎样才能实现它?
ClassA.h
- (void)viewDidLoad
{
//initialise arrayPlaces and arrayWeather
[super viewDidLoad];
dispatch_async(queue, ^{
NSData* data = [NSData dataWithContentsOfURL:
serverURL];
[self performSelectorOnMainThread:@selector(fetchedData:)
withObject:data waitUntilDone:YES];
});
}
- (void)fetchedData:(NSData *)responseData {
//parse out the json data
NSError *error;
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
tempArray = [NSJSONSerialization
JSONObjectWithData:responseData //1
options:kNilOptions
error:&error];
//declare arrayPlaces
arrayToPass = [[NSMutableArray alloc] init];
//...codes to add array here using a loop...
[arrayToPass addObject:tempString];
}
在ClassB中,我有一个tableView,我想从ClassA获取所有数组。我怎样才能做到这一点?
ClassA *cA = [[ClassA alloc]init];
ClassA.view;
arrayReceived = ClassA.arrayToPass;
以上在ClassB中实现时似乎不起作用。
ClassB *cB = [[ClassB alloc] init];
[cB setArrayReceived:arrayToPass];
在代码的这部分之后在ClassA中实现时,这也不起作用。 “//...codes使用循环在这里添加数组... [arrayToPass addObject:tempString];
请帮忙!!谢谢!
答案 0 :(得分:2)
您的代码不起作用的原因是fetchData:
异步完成,而代码arrayToPass
运行时仍未填充arrayReceived = ClassA.arrayToPass;
。
所以我们必须让ClassB
知道这一点。
如何在ClassADelegate
和ClassA
之间首次声明协议ClassB
,并在ClassA
中声明ClassADelegate
类型的属性,如下所示:
in ClassA.h
@protocol ClassADelegate ;//Forward declaration of the protocol
@interface ClassA {...
}
@property (nonatomic, assign) id <ClassADelegate> delegate;
@end
@protocol ClassADelegate <NSObject>
-(void) classADidReceiveData:(NSArray *)array;
@end
然后让ClassB
成为此
@interface ClassB : <ClassADelegate> { ...
当然在ClassB中实现方法classADidReceiveData:
:
-(void)classADidReceiveData:(NSArray*) array{
arrayReceived = array;
}
然后修改fetchData:
,如:
- (void)fetchedData:(NSData *)responseData {
...
//...codes to add array here using a loop...
[arrayToPass addObject:tempString];
//Call the delegate method if a delegate has been set
if(delegate){
[delegate classADidReceiveData:arrayToPass]
}
}
因此,当ClassA
收到数据时,可以让ClassB
注意到这一点。
总体用法是:
ClassA *cA = [[ClassA alloc]init];
cA.delegate = self;
cA.view;
如果您在ClassB
中获取数据后仍有事要做,请在classADidReceiveData
中的ClassB
中进行操作。
-(void)classADidReceiveData:(NSArray *)array{
arrayReceived = array;
//Do whatever you want after receiving array
}
答案 1 :(得分:0)
将A类数组作为A类的property
,然后您可以在B类中轻松访问它。
in Class A.h
@property (strong, nonatomic) NSMutableArray *tempArray;
in Class A.m
@synthesize tempArray;
然后在B类中获取A类的实例,您可以tempArray
class_a_object.tempArray
答案 2 :(得分:0)
首先,您必须将A类中的数组声明为成员变量。 A类需要一个返回它的方法(如果它是@property,可以使用@synthesize)。
现在,你有选择。 B类可以有一个A实例作为成员:然后它只是要求A表示数组(指针)。 B类可以由将数组传递给A和B的人实例化。或者A中需要访问B数组的方法可以由具有B作为成员的人调用,因此可以访问B的数组。
可能还有更多选择。
答案 3 :(得分:0)
在app delegate中取一个数组。声明属性并在app delegate中合成。然后当你在A类时,然后这样做
将此代码写入A类
Appdelegate *app = (AppDelegate *) [[UIApplication sharedApplication] delegate];
app.somearray = self.yourarray;
在classB中你可以这样做。
Appdelegate *app =(AppDelegate *) [[UIApplication sharedApplication] delegate];
NSLog(@"arr is %@",app.somearray);