簡體   English   中英

目標C整數第一次是0,但是第二次改變

[英]Objective C Integer is 0 first time, but it changes second time

好的,所以我有這個程序可以通過Web服務器進行通信(PHP腳本)

我有這種方法,我想獲得一個表的隨機ID。 該NSURLconnection的返回數據被假定為表中的行數。

第一次調用它,它的像randomid變量沒有被設置,但是第二次我運行它,它被設置了。

變量設置:

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

這是我的按鈕操作:

- (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變量一樣。

謝謝你的時間!

[self randomID]立即返回,因為您正在randomID函數內進行異步調用。

在NSLog ivar randomid之后執行的didFinish回調上設置了randomid。

您正在使用異步網絡,因此在從服務器檢索隨機ID之前將調用NSLog 有多種解決方案。

  • 使用同步網絡(我不建議這樣做,因此我不做進一步介紹)
  • connectionDidFinishLoading方法末尾生成ID時,放入NSLog語句或您要執行的操作
  • 如果可能,我建議在設備上生成ID(但我想您需要數據庫,URL或其他內容的唯一密鑰,因此這可能對您不起作用)

您添加了嗎?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM