Оптимизация триггера

UITableViewDelegate не нуждается в cell.delegate = self.

Если у вас CustomTableCell есть ваш Custom Delegate, вам нужно только назначить его. Итак, если у вас нет ant Custom Delegate для вашего CustomTableCell, удалите эту строку.

Для методов делегата tableView вы должны добавить это в viewDidLoad ():

yourTableView.delegate = self
yourTableView.dataSource = self

Или подключите его только с помощью StoryBorad.

Ответа на этот вопрос: Как вы создаете делегат ячейки в классе CustomTableCell? Просто любопытно

CustomTableCell.swift:

// Custom protocol 
protocol CustomCellDelegate: NSObjectProtocol {
   // Protocol method
   func someFunctionToPassSomeValue(name: String)
}
class CustomTableCell: UITableVieCell {
   weak var delegate: CustomCellDelegate?

  // Your class implementations and outlets..

  //Call your protocol method in some action, for example in button action
  @IBAction func buttonAction(sender: UIButton) {
    delegate?.someFunctionToPassSomeValue(name: "anyStringValue")
  } 
}

Затем в классе ViewController вам нужно назначить экземпляр пользовательской переменной делегата.

let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier") as! CustomTableCell
cell.delegate = self

И реализовать метод протокола:

extension ViewController: CustomCellDelegate {
   func someFunctionToPassSomeValue(name: String) {
      print("Delegate is working. Value : \(name)")
   }
}
1
задан ABOUMOUAYED N 20 January 2019 в 19:14
поделиться

2 ответа

Благодаря М. Биллу Карвину, код стал более чистым. В течение года я изменил его на «% Y». Код теперь:

CREATE TRIGGER `update_request_missions_after_insert` BEFORE INSERT ON `request_missions`
FOR EACH ROW
BEGIN
  DECLARE next_id INT;
  SELECT COALESCE(MAX(id),0) + 1 INTO next_id FROM request_missions;
  IF next_id BETWEEN 1 AND 9 THEN
    SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%Y'), '-', '00000', next_id);
  ELSEIF next_id BETWEEN 10 AND 99 THEN
    SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%Y'), '-', '0000', next_id);
  ELSEIF next_id BETWEEN 100 AND 999 THEN
    SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%Y'), '-', '000', next_id);
  ELSEIF next_id BETWEEN 1000 AND 9999 THEN
    SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%Y'), '-', '00', next_id);
  ELSEIF next_id BETWEEN 10000 AND 99999 THEN
    SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%Y'), '-', '0', next_id);
  ELSEIF next_id BETWEEN 100000 AND 999999 THEN
    SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%Y'), '-', next_id);
  END IF;
END

Предупреждение: это страдает от состояния гонки. Например, если две таблицы вставляются в таблицу одновременно, они могут прочитать один и тот же next_id.

Есть ли решение этой проблемы, зная, что целью этого триггера является добавление числа в формате «YYYY-ID» для каждой добавленной строки. ГГГГ: идентификатор текущего года: идентификатор форматированной строки, как показано в триггере

0
ответ дан ABOUMOUAYED N 20 January 2019 в 19:14
поделиться

Вот предложение по использованию локальной переменной вместо повторения вашего подзапроса три раза. Вы сказали, что это ваша забота.

CREATE TRIGGER `update_request_missions_after_insert` BEFORE INSERT ON `request_missions`
FOR EACH ROW
BEGIN
  DECLARE next_id INT;
  SELECT COALESCE(MAX(id),0) + 1 INTO next_id FROM request_missions;
  IF next_id BETWEEN 1 AND 9 THEN
    SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%y'), '-', '00000', next_id);
  END IF;
END

Предупреждение: это страдает от состояния гонки. Например, если два сеанса вставляются в таблицу одновременно, они могут оба читать одно и то же next_id.

Также, как @ P.Salmon прокомментировал выше, результаты не определены, если next_id> 9. Я не уверен, что вы пытаетесь сделать.

Возможно, вы захотите разрешить более длинные числа и дополнить их фиксированной длиной нулями:

LPAD(next_id, 6, '0')

См. Руководство по функции LPAD () . [ 1123]

Я использовал COALESCE(MAX(id),0), чтобы убедиться, что по крайней мере одно возвращаемое значение, отличное от NULL, в случае, если таблица содержит ноль строк.

Это также касается:

DATE_FORMAT(CURDATE(),'%y')

Год из двух цифр перенесется на 00 через 81 год. Именно так и была создана проблема Y2K! Я знаю, что к тому времени вы не будете работать над кодом, поэтому вам может быть все равно. Но вы всегда должны кодировать так, как будто человек, который в конечном итоге поддерживает ваш код, является жестоким психопатом, который знает, где вы живете.


Ваш новый код опубликован в другом ответе:

Это лучшее решение для обработки чисел next_id до 999 999.

CREATE TRIGGER `update_request_missions_after_insert` BEFORE INSERT ON `request_missions`
FOR EACH ROW
BEGIN
  DECLARE next_id INT;
  SELECT COALESCE(MAX(id),0) + 1 INTO next_id FROM request_missions;
  IF next_id < 1000000 THEN
    SET NEW.rm_number = CONCAT(DATE_FORMAT(CURDATE(),'%y'), '-', LPAD(next_id, 6, '0'));
  ELSE
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'RM Number has reached capacity'
  END IF;
END

Проблема состояния гонки отличается, и пока вы не используете MAX(id), чтобы найти последний идентификатор, решения не существует. Проблема в том, что у вас может быть несколько клиентов, одновременно вставляющих в таблицу. Каждый сеанс клиента будет читать одно и то же значение для MAX(id) и использовать его.

Вы должны прочитать о Расовых условиях .

Что вам действительно нужно, так это какой-то способ использования значения AUTO_INCREMENT, которое генерирует новые уникальные значения в поточно-ориентированном виде, и копирует значение в ваш rm_number.

К сожалению, нет способа сделать это в триггере. Во время триггера BEFORE INSERT новое значение AUTO_INCREMENT еще не генерируется. Во время триггера AFTER INSERT вы не можете изменить NEW.rm_number, потому что вставка уже сделана. В прошлом я писал об этом:

0
ответ дан Bill Karwin 20 January 2019 в 19:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: