Делает выражение крона в unix/linux, позволяют указывать точный запуск и даты окончания

То, что вы сделали, это непосредственно для рисования одной линии. Вы используете первое касание в своих методах touch, а также у вас есть только одна «текущая строка».

Я бы пошел с чем-то вроде следующего. Я надеюсь, что код говорит сам за себя:

class Line {
    var start: CGPoint = .zero
    var end: CGPoint = .zero
}

private var finishedLines: [Line] = [Line]()
private var currentLines: [UITouch: Line] = [UITouch: Line]()

private func insertNewPoint(_ point: CGPoint, forTouch touch: UITouch) {
    if let line = currentLines[touch] {
        line.end = point
    } else {
        currentLines[touch] = {
            let newLine = Line()
            newLine.start = point
            return newLine
        }()
    }
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    touches.forEach { touch in
        insertNewPoint(touch.location(in: self.view), forTouch: touch)
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesMoved(touches, with: event)
    touches.forEach { touch in
        insertNewPoint(touch.location(in: self.view), forTouch: touch)
    }
}

private func finishLine(at point: CGPoint, forTouch touch: UITouch) {
    guard let line = currentLines[touch] else { return }
    currentLines[touch] = nil
    line.end = point
    self.finishedLines.append(line)
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesEnded(touches, with: event)
    touches.forEach { touch in
        finishLine(at: touch.location(in: self.view), forTouch: touch)
    }
}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesCancelled(touches, with: event)
    touches.forEach { touch in
        finishLine(at: touch.location(in: self.view), forTouch: touch)
    }
}

Так что, где вы обрабатываете прикосновения, наиболее важно перебрать все из них touches.forEach { touch in. И вам нужен набор строк, которые в вашем случае должны быть назначены на штрихи. Он должен работать с использованием словаря [UITouch: Line].

Полный пример:

import UIKit

class ViewController: UIViewController {

    private var finishedLines: [Line] = [Line]()
    private var currentLines: [UITouch: Line] = [UITouch: Line]()

    private var lineView: LineView?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.isMultipleTouchEnabled = true
        self.lineView = {
            let view = LineView(frame: self.view.bounds)
            view.isUserInteractionEnabled = false
            self.view.addSubview(view)
            return view
        }()
    }

    private func updateDrawing() {
        lineView?.lines = finishedLines + currentLines.map { [111].value }
        lineView?.setNeedsDisplay()
    }

    private func insertNewPoint(_ point: CGPoint, forTouch touch: UITouch) {
        if let line = currentLines[touch] {
            line.end = point
        } else {
            currentLines[touch] = {
                let newLine = Line()
                newLine.start = point
                return newLine
            }()
        }
        updateDrawing()
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        touches.forEach { touch in
            insertNewPoint(touch.location(in: self.view), forTouch: touch)
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesMoved(touches, with: event)
        touches.forEach { touch in
            insertNewPoint(touch.location(in: self.view), forTouch: touch)
        }
    }

    private func finishLine(at point: CGPoint, forTouch touch: UITouch) {
        guard let line = currentLines[touch] else { return }
        currentLines[touch] = nil
        line.end = point
        self.finishedLines.append(line)
        updateDrawing()
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesEnded(touches, with: event)
        touches.forEach { touch in
            finishLine(at: touch.location(in: self.view), forTouch: touch)
        }
    }

    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesCancelled(touches, with: event)
        touches.forEach { touch in
            finishLine(at: touch.location(in: self.view), forTouch: touch)
        }
    }


}

// MARK: - Line

extension ViewController {

    class Line {
        var start: CGPoint?
        var end: CGPoint?
    }

}

// MARK: - LineView

extension ViewController {

    class LineView: UIView {

        var lines: [Line]?

        override func draw(_ rect: CGRect) {
            super.draw(rect)

            // Fill white background
            UIColor.white.setFill()
            UIBezierPath(rect: rect).fill()

            // Draw all lines
            UIColor.red.setStroke()
            lines?.forEach { line in
                if let start = line.start, let end = line.end {
                    let path = UIBezierPath()
                    path.move(to: start)
                    path.addLine(to: end)
                    path.stroke()
                }
            }
        }

    }

}

Вы можете вставить этот код во вновь созданный проект Xcode iOS в свой ViewController, и он должен работать.

15
задан Chris Upchurch 8 April 2009 в 19:28
поделиться

5 ответов

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

Обратите внимание, что необходимо будет оставить сценарий как неисполняемый файл до тех пор, пока Вы хотите, чтобы он работал.

Следующие выражения крона сделают то, что Вы хотите (каждый день, включая выходные). Тонкая настройка, поскольку Вы должны:

# Make the job executable on 29 June.
0 6 29 6 * chmod +x /path/to/my/job/script

# Run the job between June and December, only if it's executable.
0 7 * 6-12 * test -x /path/to/my/job/script && /path/to/my/job/script

# Disable execution after 30 December.
0 8 30 12 * chmod -x /path/to/my/job/script
5
ответ дан 1 December 2019 в 03:35
поделиться

Можно использовать это для генерации crontab, который работает в определенных интервалах:

http://www.robertplank.com/cron/

Или это

http://www.webmaster-toolkit.com/cron-generator.shtml

Одно решение состояло бы в том, чтобы установить 6 кронов, 1 в течение каждого месяца, каждый будет работать в 7:00 каждый день в том месяце.

Это - вероятно, самый легкий путь, следующий должен был бы написать сценарий его.

-1
ответ дан 1 December 2019 в 03:35
поделиться

Это может быть сделано в хитром виде пути.

Вам нужны три отдельных cron задания для того диапазона, все выполняющие тот же код (X в этом случае):

  • один на 29-е и 30-е июня ("0 7 29,30 6 * X").
  • один в течение каждого дня в месяцах с июля по ноябрь ("0 7 * 7-11 * X").
  • один для всех кроме в последний день в декабре ("0 7 1-30 12 * X").

Это дает Вам:

# Min   Hr   DayOfMonth   Month   DayOfWeek   Command
# ---   --   ----------   -----   ---------   -------
   0     7      29,30        6        *          X
   0     7          *     7-11        *          X
   0     7       1-30       12        *          X

Затем удостоверьтесь, что Вы комментируете их, до 29 июня 2010 приходит. Можно добавить финал cron задание 31 декабря, чтобы послать Вам по электронной почте, что это должно быть отключено.

Или Вы могли изменить X сразу выйти, если год не является 2009.

if [[ "$(date +%Y)" != "2009" ]] ; then
    exit
fi

Затем не будет иметь значения, если Вы забудете отключать задания.

16
ответ дан 1 December 2019 в 03:35
поделиться

Я обычно фанат сохранения логики при запуске программы. Вы можете подумать о настройке одного задания cron, которое запускает скрипт каждый день, а затем сделать так, чтобы скрипт сам решал, должен ли он делать что-то полезное. По истечении последнего полезного дня (30 декабря) ваш скрипт может удалить себя из crontab. В этом скрипте вы можете настроить логику со всеми комментариями, необходимыми для описания того, что вы делаете и почему.

Если ваша работа - бинарная программа, вы можете настроить скрипт run_script, который выполняет эту фильтрацию расписания перед вызовом программы. .

Вы можете подумать о настройке одного задания cron, которое запускает скрипт каждый день, а затем сделать так, чтобы скрипт сам решал, должен ли он делать что-то полезное. По истечении последнего полезного дня (30 декабря) ваш скрипт может удалить себя из crontab. В этом скрипте вы можете настроить логику со всеми комментариями, необходимыми для описания того, что вы делаете и почему.

Если ваша работа - бинарная программа, вы можете настроить скрипт run_script, который выполняет эту фильтрацию расписания перед вызовом программы. .

Вы можете подумать о настройке одного задания cron, которое запускает скрипт каждый день, а затем сделать так, чтобы скрипт сам решал, должен ли он делать что-то полезное. По истечении последнего полезного дня (30 декабря) ваш скрипт может удалить себя из crontab. В этом скрипте вы можете настроить логику со всеми комментариями, необходимыми для описания того, что вы делаете и почему.

Если ваша работа - бинарная программа, вы можете настроить скрипт run_script, который выполняет эту фильтрацию расписания перед вызовом программы. .

2
ответ дан 1 December 2019 в 03:35
поделиться

Нет, afaik, Вы не можете сделать этого.

Поля крона содержат значения в течение многих минут, часов, дня месяца, месяца и дня недели, соответственно.

10 5 10 * * means run at 5:10 on every 10th of every month.

10 5 * 12 * means run at 5:10 on every day in december

10 5 * * 1  means run at 5:10 every Monday

Можно заставить его работать на ряде определенных месяцев, поскольку crontab формат действительно принимает диапазоны. С апреля по декабрь был бы 4-12 в этом случае для поля месяца. Но это не принимает во внимание Ваше желание того, чтобы ограничить это 2009.

Нет никакого механизма для установки, запускают и останавливают даты cronjob. Можно всегда писать сценарий этого, конечно. Сделайте cronjob выполняемым каждый день и проверьте текущую дату, чтобы быть прежде 30/12. Если это - 31/12, заставляют его удалить себя. Или что-то более продуманное.

crontab

0 7 * * 6-12 command_X

сделал бы то, что Вы хотите частично, но это запустилось бы 1-го июня и пробежало бы 31-го декабря. Пропуск первой части июня и 31-го декабря должен был бы быть задан сценарием в этих X командах.

-1
ответ дан 1 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

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