2012-03-12 73 views
0

我不知道,但自從使用iOS5(現在5.1)和Xcode 4(現在4.3)以來,無論如何每次都會調用ViewDidLoad。我必須從API中獲取JSON輸出,但是如果我將獲取代碼放在ViewDidLoad中,它會被每次調用。所以我的問題是,是否可以/合法(從Appstore的角度來看)使用initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil中的NSURLConnection代碼?initWithNibName中的NSURLConnection?

繼承人的代碼

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
     jsonContent=[[NSMutableData alloc]init]; 
     stateConnection= [[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"MY API"]] delegate:self startImmediately:YES]; 
    } 
    return self; 
} 

編輯:它不工作。 NSURLConnection代碼在這個方法中不起作用。所以我應該怎麼做,以便它只被調用一次?

+1

當‘viewDidLoad中’獲取調用,爲什麼不「initWithNibName」被調用?如果你調用「initWithNibName」,那麼只有「viewDidLoad」也會被調用。是不是? – Satyam 2012-03-12 10:07:24

+0

是的,這是真的,但斷點似乎不工作的方法。我是否確保連接只有第一次進行 – 2012-03-12 10:16:34

回答

1

如您所描述的,將代碼放入init方法是完全「合法」的。事實上,正如您所注意到的,可能會多次調用viewDidLoad(例如,在內存不足警告後)。

至於爲什麼你的代碼不工作,我不認爲有足夠的上下文來確定。 if塊中的代碼是否實際執行?我的猜測是否定的。如果您使用iOS5和故事板,則不使用initWithNibName方法。如果您將相同的代碼放入initWithCoding:方法中,您可能會獲得更多成功。

+0

是的,我正在使用storyboards。謝謝你的建議。那麼我存儲在NSUserDefaults數組中的JSON輸出,現在我檢查數組是否存在我n默認情況下,連接不被調用。有這種方法嗎? – 2012-03-12 10:20:57

+0

@AkashMalhotra只要沒有大量數據,聲音就沒有問題。 – 2012-03-12 10:42:10

0

將代碼放入viewDidLoad中非常合適。只要檢查一下,如果你已經初始化它。

if(jsonContent == nil) { 
    jsonContent=[[NSMutableData alloc]init]; 
    stateConnection= [[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"MY API"]] delegate:self startImmediately:YES]; 
    } 
} 

隨着查收你甚至可以在以後啓動它(如果它符合您的需求更好,就像在viewWillAppear' or viewDidAppear」,甚至按下一個按鈕或其他任何東西之後。