2012-04-05 3 views
1

У меня есть 2 класса. A и B. Внутри ClassA У меня есть метод, который извлекает данные JSON и добавляет в массив. Я хочу получить доступ к этому массиву из ClassB. Как я могу это достичь?XCode Передача NSMutableArray из разных классов

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]; 
} 

В классеB у меня есть 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

Вы пробовали использовать однотонную форму класса A? – holographix

ответ

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> { ... 

и, конечно, реализовать метод 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, то сделать это в classADidReceiveData в ClassB.

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

Im имеет ожидаемую ошибку идентификатора в этой строке. на классе A.h - (void) classADidReceiveData: (массив NSArray *); – Hexark

+1

У меня также есть неизвестное имя типа в @property (nonatomic, assign) ClassADelegate * delegate; – Hexark

+0

Извините, отредактировал ответ. Для ожидаемого идентификатора измените протокол «ClassADelegate» на протокол «ClassADelegate » и для имени неизвестного типа, измените свойство (неатомное, присваивание) «ClassADelegate * delegate;»; to property (nonatomic, assign) 'id delegate;'. Я сейчас работаю над android и запутался с интерфейсом Java: -/ – skonb

0

Сделать массив класса А как property из! класс а, то вы можете легко получить доступ к нему в классе B.

in Class A.h 

@property (strong, nonatomic) NSMutableArray *tempArray; 

in Class A.m 

@synthesize tempArray; 

затем получить экземпляр класса а в класс в, и вы можете получить доступ к tempArray в class_a_object.tempArray

+0

ClassA * cA = [[ClassA alloc] init]; ClassA.view; arrayReceived = ClassA.arrayToPass; Разве это не то, что я сделал? – Hexark

+0

, если вы выделите класс A в классе b, тогда вы всегда получите пустой массив, вам нужно получить тот же экземпляр класса a, который в настоящее время находится в памяти. – saadnib

+0

oh .. так как я могу получить тот же экземпляр? – Hexark

0

во-первых, вы должны пусть массив в классе A будет объявлен как переменная-член. А классу А нужен метод, который возвращает его (можно использовать @synthesize, если это @property).

Теперь у вас есть выбор. Класс B может иметь экземпляр A в качестве члена: тогда он просто запрашивает A для массива (указатель). Класс B может быть создан кем-то, кто передает массив как A, так и B. Или метод в A, который нуждается в доступе к массиву B, может быть вызван тем, у кого есть B как член, и поэтому он имеет доступ к массиву B.

Может быть еще выбор.

+0

Любой образец кода? – Hexark

0

Возьмите массив в приложении delegate.Declare Имущества и синтезирует в приложении delegate.And тогда, когда вы находитесь в классе А, то делать как этот

Написать этот код в классе А

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

В классе B вы можете сделать вот так.

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

По-прежнему не получается заставить его работать ... Мой классA предоставляет массив, поэтому я вызываю свой класс ClassA по классу A * cA = [[ClassA alloc] init]; cA.view; Это правильно? – Hexark

Смежные вопросы