В результате наших комментариев давайте вместе с делегированием посмотрим, сможем ли мы решить вашу проблему:
Объявив протокол, вы можете сделать это в другом файле или в своем ViewController
:
Этот протокол имеет метод для извлечения данных снова после добавления данных в FormulaViewController
protocol DataFetcherDelegate {
func fetchData()
}
class ViewController: UIViewController {
. Затем выполните этот протокол из ваших ViewController
:
class ViewController: UIViewController, DataFetcherDelegate {
После вы соответствуете протоколу, вам нужно будет реализовать метод fetchData
внутри ViewController
, именно здесь вы будете помещать запрос на выборку основных данных для получения обновленных данных:
func fetchData() {
print("fetchingData")
// write your data fetching code here, then make your arrays equal respectively again.
// once fetching and assigning data to arrays are complete do:
tableView.reloadData()
}
Теперь перейдите к FormulaViewController
и добавьте переменную delegate
следующим образом:
class FormulaViewController: UIViewController {
var delegate: DataFetcherDelegate?
Затем вернитесь к ViewController
, где бы вы ни создавали свой экземпляр FormulaViewController
(я получил код ниже из вашего комментария, вам также нужно отлить VC как FormulaViewController
, он немного обновлен, не используйте ваш старый код) и назначить ViewController
как delegate
из FormulaViewController
:
let vc = storyboard!.instantiateViewController(withIdentifier: "formulaView") as! FormulaViewController
vc.delegate = self // assigning self as delegate of FormulaVC
self.present(vc, animated: true, completion: nil)
Теперь мы закончили с частью ViewController
, теперь мы перейдем к FormulaViewController
и сделаем следующее:
Перед тем, как вы отклоните свой поп upView после успешного сохранения новых данных, теперь мы скажем нашему delegate
(ViewController
) снова извлечь данные ядра, затем мы отклоним FormulaViewController
:
//save your respective item to your core data, formula, time or step
// then for the sake of example, lets add a Formula:
let newFormula = Formula(/*with your core data context*/)
//save to your core data with context. like persistentContainer.viewContext.save(), I dont know how you implemented that.
delegate?.fetchData()
dismiss(animated: true, completion: nil)
Теперь, надеюсь, однажды FormulaViewController
удаляется, данные ViewController
также будут обновлены.
Я иногда использую подход, который я описываю ниже по той же самой причине, что @Boris указывает: Я предпочел бы, чтобы использование некоторого кода было так же легко, как a) svn контроль/обновление - b) идут.
Но для записи:
Так или иначе подход, который я использую, зависит от изменения sys.path и работает как это:
project/ *.py scriptcustomize.py file.pth thirdparty/ eggs/ mako-vNNN.egg ... .egg code/ elementtree\ *.py ...
from scriptcustomize import apply_pth_files apply_pth_files(__file__)
import os from glob import glob import fileinput import sys def apply_pth_files(scriptfilename, at_beginning=False): """At the top of your script: from scriptcustomize import apply_pth_files apply_pth_files(__file__) """ directory = os.path.dirname(scriptfilename) files = glob(os.path.join(directory, '*.pth')) if not files: return for line in fileinput.input(files): line = line.strip() if line and line[0] != '#': path = os.path.join(directory, line) if at_beginning: sys.path.insert(0, path) else: sys.path.append(path)
# contents of *.pth file thirdparty/code thirdparty/eggs/mako-vNNN.egg
Просто используйте virtualenv - это - инструмент для создания изолированных сред Python. Можно создать сценарий установки и распределить целый набор, если Вы хотите.
"Мне не нравится то, что разработчики (или меня запускающийся на чистой новой машине) должны перейти через distutils обручи необходимости установить библиотеки локально, прежде чем они смогут начать"
Почему?
Что - конкретно - является неправильным с этим?
Вы сделали это для создания проекта. Ваш проект является настолько популярными другими, хотят сделать то же.
Я не вижу проблемы. Обновите свой вопрос с определенными проблемами, в которых Вы нуждаетесь решенный. Неприязнь способа, которым распределяется открытый исходный код, не является проблемой - это - способ, которым работает открытый исходный код.
Править. "Окруженный стеной сад" не имеет значения очень.
Выбор 1. Вы могли, BTW, создать "установщик", который выполняет easy_install 6 раз для них.
Выбор 2. Можно сохранить все наборы установщика, которые использовал бы easy_install. Затем можно предоставить сценарий, который делает разархивировать и a python setup.py install
для всех шести.
Выбор 3. Можно обеспечить заархивированную версию Вашего site-packages
. После того, как они установят Python, они разархивировали Ваш каталог пакетов сайта в 'C:\Python2.5\lib\site-packages''.
Выбор 4. Можно создать собственный набор установщика MSI для среды Python.
Выбор 5. Можно разместить собственный подобный pypi сервер и обеспечить easy_install, который проверяет сервер сначала.
Я соглашаюсь с ответами Nosklo и S.Lott. (+1 обоим)
Могу я просто добавить, что то, что Вы хотите сделать, является на самом деле ужасной идеей.
Если Вы действительно захотите, чтобы люди взломали на Вашем коде, то им будет нужно некоторое понимание вовлеченных библиотек, как они работают, каковы они, куда они происходят из, документация для каждого и т.д. Уверенный предоставляют им сценарий начальной загрузки, но кроме того Вы будете трястись до такой степени, что они невежественны.
Затем существуют конкретные вопросы такой как "что, если один пользователь хочет установить другую версию или реализацию библиотеки?", явным примером здесь является ElementTree, поскольку это имеет много реализаций.
Я не предполагаю, что это - прекрасная идея, но обычно что я делаю в ситуациях как они, то, что у меня есть Make-файл, зарегистрировался в подверсии, которая содержит, делают правила выбрать все зависимые библиотеки и установить их. Make-файл может быть достаточно умным, чтобы только применить зависимые библиотеки, если они не присутствуют, таким образом, это может быть относительно быстро.
Новый разработчик на проекте просто проверяет из подверсии и затем вводит, "делают".
Этот подход мог бы работать хорошо на Вас, учитывая, что Ваша аудитория уже привыкла к идее использовать контроль подверсии в качестве части их процесса выборки. Кроме того, это имеет хорошее свойство, что все знание о Вашей программе, включая ее внешние зависимости, получено в репозитории исходного кода.