NSData (оператор if)

Я пытаюсь отфильтровать результаты поиска в базе данных.

В моем приложении для iOS реализован сканер штрих-кода. Теперь, когда я сканирую, он сканирует штрих-код и выдает предупреждение. Кнопка Index 1 ведет к этому вызову NSData:

NSString *salesStr = @"http://10.0.0.1:";
salesStr = [salesStr stringByAppendingString:@"8080"];
salesStr = [salesStr stringByAppendingString:@"/barcode.php?password="];
salesStr = [salesStr stringByAppendingString:@"test"];
salesStr = [salesStr stringByAppendingString:@"&db="];
salesStr = [salesStr stringByAppendingString:@"testDB"];
salesStr = [salesStr stringByAppendingString:@"&barNum="];
salesStr = [salesStr stringByAppendingString:self.scannedItem];

NSURL * url = [NSURL URLWithString:salesStr];
NSData * data = [NSData dataWithContentsOfURL:url];

10.0.0.1:8080/barcode.php?password=test&db=testDB&barNum=0123456789012

Итак, что я пытаюсь сделать: если отсканированного элемента нет в базе данных, то база данных переходит с использованием идентификатора scanMissing; и, конечно, если отсканированный элемент находится в базе данных, то он использует scanSuccess.

if(data == nil)
{

    [self performSegueWithIdentifier:@"scanMissing" sender:self];

}
else
{

    [self performSegueWithIdentifier:@"scanSuccess" sender:self];

}
}

Моя проблема в том, что я не могу использовать nil, потому что некоторые байты все еще передаются. Когда я устанавливаю точки останова, я получаю следующую информацию для данных:

данные (_NSInlineData) 2 байта

Должен ли я изменить оператор if на 2 байта, чтобы он работал? Или что мне делать?

РЕДАКТИРОВАТЬ: PHP-КОД:

$host = "localhost";
$db = $_REQUEST['db'];
$user = "root";
$pass = $_REQUEST['password'];
$barcode = $_REQUEST['barNum'];

$connection = mysql_connect($host, $user, $pass);

//Check to see if we can connect to the server
if(!$connection)
{
    die("Database server connection failed.");
}
else
{
    //Attempt to select the database
    $dbconnect = mysql_select_db($db, $connection);

    //Check to see if we could select the database
    if(!$dbconnect)
    {
        die("Unable to connect to the specified database!");
    }
    else
    {
        $query = "SELECT ITEM_ID, ITEM_Kitchen_Name FROM it_titem WHERE ITEM_ID=$barcode";
        $resultset = mysql_query($query, $connection);

        $records = array();

        //Loop through all our records and add them to our array
        while($r = mysql_fetch_assoc($resultset))
        {
            $records[] = $r;
        }

        //Output the data as JSON
        echo json_encode($records);
    }


}


?>

person Machina    schedule 19.08.2014    source источник
comment
Я не понимаю, почему некоторые байты все еще передаются — dataWithContents URL — это синхронный вызов. При этом, если это будет делать сетевой запрос, он будет заблокирован, что вам не нужно. рассмотрите возможность использования метода dataTaskWithURL:completionHandler: класса NSSession   -  person Owen Hartnett    schedule 19.08.2014


Ответы (2)


Ваш PHP-код выводит массив в формате JSON. Таким образом, наименьший возможный ответ — []. В любом случае это не могло быть nil.

Можно попробовать сравнить данные с [], а можно раскодировать JSON и проверить длину массива. Второй вариант ИМХО самый надежный.

NSError *error = nil;
NSArray *results = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

if (error != nil)
{
    // There was an error parsing the JSON, do whatever you want
}
else if (results.count == 0)
{
    // no results
}
else
{
    // results
}

(не проверял).

person jcaron    schedule 19.08.2014

ИМХО Вы должны справиться с этим своим PHP.

Если вы найдете что-то

{
    "Success" : true,
    "Response" : {
        "ID": 1234,
        "Name":"Name string"
    }
}

Если не

{
    "Success" : false,
    "Response" : {
    }
}

Также вы можете попробовать использовать JSONModel

person Quver    schedule 19.08.2014