Файлы исходного кода не имеют значения. Вы можете иметь все эти вещи в одном файле (не то, чтобы это было бы хорошей идеей), и проблема не изменится. Что важно, так это классы.
Классы - это не просто пакеты с кодом; Вы разрабатываете их, называете их и определяете зону ответственности каждого класса. Класс и / или его экземпляры делают определенные вещи; Вы определяете, что это за вещи, а какие нет.
При написании подклассов NSOperation не беспокойтесь о потоках. Там нет никакой гарантии, что они даже будут работать в отдельных потоках. Каждая операция - это просто единица работы; вы пишете операцию, чтобы сделать одну вещь, какой бы она ни была.
Например: main.m --- обрабатывает пользовательский интерфейс и имеет код для запуска 2 потоков -
Операция
- когда пользователь нажимает кнопку «Пуск».
thread1.m - вычисляет конкретное значение и продолжает делать это, пока пользователь не нажмет стоп.
Это не одно; это неопределенная последовательность вещей.
thread2.m - необходимо использовать этот поток для обновления пользовательского интерфейса в main.m значением, которое вычисляет thread1.m.
Не следует прикасаться к интерфейсу пользователя (что может быть) из вторичного потока. См. Руководство по программированию потоков , в особенности резюме по безопасности потоков.
Я не понимаю, почему это вообще нужно нарезать. Вы можете сделать все это намного проще с NSTimer, работающим в главном потоке.
Если было бы неуместно «вычислять… определенное значение» в главном потоке, вы можете сделать это операцией. Ваш ответ на сообщение таймера создаст операцию и добавит ее в вашу очередь вычислений. Когда пользователь нажимает стоп, это действие будет выполняться в основном потоке; аннулируйте таймер и подождите, пока очередь завершит все оставшиеся операции.
При любом решении «thread2.m» полностью исчезает. Ваше обновление пользовательского интерфейса будет (и должно) происходить исключительно в главном потоке. С последним решением вам даже не нужно ждать, пока вы закончите; вы можете обновлять интерфейс с информацией о текущем прогрессе каждый раз, когда получаете сообщение таймера.