XCode中不同阶层传递的NSMutableArray(XCode Passing NSMutabl

2019-09-16 09:02发布

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

请帮忙!! 谢谢!

Answer 1:

您的代码不工作的原因是因为fetchData:是异步完成和arrayToPass仍然没有填充当代码arrayReceived = ClassA.arrayToPass; 运行。

因此,我们必须让ClassB知道这一点。 如何首先声明一个协议ClassADelegate之间ClassAClassB ,并在声明属性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> { ...

当然实现方法classADidReceiveData:在ClassB的:

-(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 ,然后做在classADidReceiveDataClassB

-(void)classADidReceiveData:(NSArray *)array{
 arrayReceived = array;
 //Do whatever you want after receiving array
}


Answer 2:

让A级的阵列的property A级,那么你可以很容易地在B级访问

in Class A.h

@property (strong, nonatomic) NSMutableArray *tempArray;

in Class A.m

@synthesize tempArray;

然后获得A类的实例在B类,你可以访问tempArrayclass_a_object.tempArray



Answer 3:

首先,必须有在类A中的阵列被声明作为成员变量。 而A类需要返回它(可以使用@synthesize如果它是一个@property)的方法。

现在,你有选择。 B类可具有的A的实例作为成员:那么它只是要求一种用于阵列(指针)。 B类可能是因为有人谁传递数组A和B两个或需要获得B的阵列可以通过人谁拥有B中的成员,因此可以访问B的阵列中调用的方法来实例化。

可能有更多的选择呢。



Answer 4:

以一个阵列中应用delegate.Declare属性,并在应用delegate.And合成那么当你在A类,然后做这样的

写A类验证码

Appdelegate *app = (AppDelegate *) [[UIApplication sharedApplication] delegate];
app.somearray = self.yourarray;

在ClassB的你可以这样做。

Appdelegate *app =(AppDelegate *) [[UIApplication sharedApplication] delegate];
NSLog(@"arr is %@",app.somearray);


文章来源: XCode Passing NSMutableArray from Different Classes
标签: xcode arrays