2012-03-12 72 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”,甚至按下一个按钮或其他任何东西之后。