2013-08-14 6 views
3

У меня проблема с реорганизацией доступа к переменной экземпляра вне метода. Я хочу получить доступ к значению в других методах. Но когда я печатаю это значение в другом методе, тогда значение null распечатаны. Итак, ребята, мне нужна ваша помощь. И если у вас не возникли вопросы, сообщите мне. ThanksДоступ к значениям переменных экземпляра вне метода в iOS

 //I am giving a snippet of my code 
//DBForHomeViewController.h class 
@interface DBForHomeViewController : UIViewController{ 
    id _jsonDB; 
} 
-(void)channelIDForDataBase; 
-(void)openDataBase; 

@end 

//DBForHomeViewController.m class 
@implementation DBForHomeViewController 
-(void)channelIDForDataBase 
{ 

    for (NSString *pNewString in stringValueOfCIdDB) { 

     NSString *recentVideoUrl=[NSString stringWithFormat:@"%@%@",pNewString,fullPublishDate,]; 


     NSURL *videoUrlPublished=[NSURL URLWithString:recentVideoUrl]; 
     NSURLRequest *requestVideoUrlPublished=[NSURLRequest requestWithURL:videoUrlPublished]; 


     AFJSONRequestOperation *operationURL = [AFJSONRequestOperation JSONRequestOperationWithRequest:requestVideoUrlPublished success:^(NSURLRequest *requestURL, NSHTTPURLResponse *response, id getSTATS) 
               { 

                _jsonDB= getSTATS; 
        // NSLog(@"DB data is:%@",_jsonDB); 
        //I am getting json data here.Now I want to access _jsonDB in other     //method ie -(void)openDataBase)       
    }failure:nil]; 
       [operationURL start]; 
    } 
} 

-(void)openDataBase 

{ 
    NSLog(@"data in another class is :%@",_jsonDB); 
    //here I am getting _jsonDB value as null 
    //I want to to have _jsonDB value in this method 
    // 
} 
+0

Это помогает, если вы показать код вызова, а также , – Abizern

ответ

1

Вы устанавливаете значение переменной через асинхронный вызов, так что возможно, что вызов не завершен, и установить переменную по времени, когда вы просите за это.

Вы не указали код, который используете для вызова этой переменной, но я подозреваю, что вы вызываете channelIDForDataBase, а затем вызываете openDataBase. Проблема в том, что при первом асинхронном вызове он не завершил свою сеть вызовите так, чтобы ivar не был установлен.

У вас есть несколько возможных решения: один из которых может быть подходящей для ваших обстоятельств, чтобы сделать вызов openDataBase, когда ваш асинхронный заканчивает вызов:

AFJSONRequestOperation *operationURL = [AFJSONRequestOperation JSONRequestOperationWithRequest:requestVideoUrlPublished success:^(NSURLRequest *requestURL, NSHTTPURLResponse *response, id getSTATS) { 
    _jsonDB= getSTATS; 
    [self openDataBase]; 

failure:nil]; 
+0

метод вызова - (void) openDataBase { [self channelIDForDataBase]; } –

+0

Как я и думал. вызов базы данных немедленно возвращается, а сетевой вызов выполняется асинхронно, поэтому, когда вы пытаетесь получить доступ к iVar, он еще не установлен. – Abizern

-1

Я считаю, что ваш объект освобождается.

ли это:

@interface DBForHomeViewController : UIViewController 
@property (strong, nonatomic) id jsonDB; 
@end 

установить его с

self.jsonDB = getSTATS; 
+0

С ARC это не имеет значения. – Abizern

0

вы указываете ID _jsonDB к getSTATS и после этого ,, getSTATS становится выпущен так, на самом _jsonDB указывает на область памяти который был удален. создал независимое пространство памяти для _jsonDB и скопировал в него содержимое getSTATS.

Сделайте что-то вроде этого.

_jsonDB =[getSTATS copy]; 
+0

Если это код ARC (что очень вероятно в эти дни), то iVar неявно устанавливается как 'strong', поэтому он не удаляется, пока объект существует. – Abizern

+0

@Abizem ... Можете ли вы подумать о другой причине, почему это происходит? –

+0

Да - я написали ответ. – Abizern

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