0

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

我有这种方法,我想为一个表获取一个随机 id。这个 NSURLconnection 的返回数据应该是表中的行数。

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

变量设置:

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

这是我的 IBaction 按钮:

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

第一次输出为:Random ID: 0,第二次输出:Random ID: a valid id

随机编号:

- (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) Random:(随机数)

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

谢谢你的时间!

4

3 回答 3

2

[self randomID] 立即返回,因为您正在 randomID 函数内部进行异步调用。

randomid 在 didFinish 回调中设置,它在您 NSLog ivar randomid 后执行。

于 2012-12-02T20:18:14.500 回答
1

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

  • 使用同步网络(我不推荐这个,所以我不深入探讨)
  • NSLog生成 ID 时的语句或您想做的任何事情放在connectionDidFinishLoading方法的末尾
  • 如果可能的话,我建议在设备上生成 ID(但我想你需要一个数据库的唯一键、一个 URL 或其他东西,所以这可能不适合你)
于 2012-12-02T21:20:24.610 回答
0

你加了这个吗?

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Append the new data to receivedData.
// receivedData is an instance variable declared elsewhere.
[randomData appendData:data];
}
于 2012-12-02T20:18:05.393 回答