XCode从不同的类传递NSMutableArray

时间:2012-04-05 11:01:03

标签: xcode arrays

我有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];

请帮忙!!谢谢!

4 个答案:

答案 0 :(得分:2)

您的代码不起作用的原因是fetchData:异步完成,而代码arrayToPass运行时仍未填充arrayReceived = ClassA.arrayToPass;

所以我们必须让ClassB知道这一点。 如何在ClassADelegateClassA之间首次声明协议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);