Objective C Integer第一次为0,但第二次更改

时间:2012-12-02 20:11:20

标签: iphone objective-c ios xcode nsurlconnection

好的,我有这个程序可以通过Web服务器(PHP脚本)进行通信

我有这种方法,我想得到一个表的随机ID。此NSURLconnection的返回数据将作为表中的行数。

我第一次调用它时,它就像randomid变量一样没有设置,但第二次运行它时,它确实被设置了。

变量设置:

@implementation ViewController {
NSMutableData *randomData;
int randomid;
}

这是我的IBaction按钮:

- (IBAction)initVits:(id)sender {
[self randomID];
NSLog(@"Random ID: %d", randomid);    
}

输出第一次是:随机ID:0,第二次:随机ID:有效ID

RandomID:

- (void) randomID {

NSString *url = @"http://ivitserdk.porkhost.dk/ivitserdk.php?function=randomid";
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]   cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:1.0];
connectionRandomID = [[NSURLConnection alloc] initWithRequest:request delegate:self];

randomData = [NSMutableData data];
[connectionRandomID start];
}

连接完成加载:

 if(connection == connectionRandomID) {
    NSString *String = [[NSString alloc] initWithData:randomData encoding:NSUTF8StringEncoding];
    NSLog(@"Return: %@", String);
    int temp = [String integerValue];
    NSLog(@"temp: %d", temp);
    randomid = (arc4random() % temp) + 1;
    NSLog(@"Random: %d", randomid);
    randomData = nil;
    connectionRandomID = nil;
 }

输出始终为:返回:(表中的行数) temp :(表中的行数为int) 随机:(随机数)

就像randomid变量第一次没有设置一样。

谢谢你的时间!

3 个答案:

答案 0 :(得分:2)

[self randomID] 因为你在randomID函数中进行异步调用,所以立即返回。

randomid在didFinish回调上设置,在你对NSar随机数据库进行NSLog后执行它。

答案 1 :(得分:1)

您正在使用异步网络,因此在从服务器检索随机ID之前调用NSLog。有多种解决方案。

  • 使用同步网络(我不建议这样做,所以我不再深入研究)
  • NSLog方法结束时生成ID时,将connectionDidFinishLoading语句或您想要执行的操作放入
  • 如果可能的话,我建议在设备上生成ID(但我想你需要一个数据库,URL或其他东西的唯一密钥,所以这可能不适合你)。

答案 2 :(得分:0)

你添加了吗?

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Append the new data to receivedData.
// receivedData is an instance variable declared elsewhere.
[randomData appendData:data];
}