Изменение обрабатывает по шаблону в XCode

Этот ответ может быть запоздалым, но я хотел бы упомянуть несколько вещей, когда ваш Activity зависит от AsyncTask. Это поможет вам предотвратить сбои и управление памятью. Как уже упоминалось в приведенных выше ответах, переходите к interface, мы также говорим, что они обратные вызовы. Они будут работать как информатор, но никогда не будут отправлять ссылки Activity или interface всегда использовать слабую ссылку в этих случаях.

Пожалуйста, обратитесь к скриншоту ниже, чтобы узнать, как это может вызвать проблемы.

Как вы можете видеть, начали ли мы AsyncTask с сильной ссылки, тогда нет гарантии, что наш Activity / Fragment будет до тех пор, пока мы не получим данные, поэтому было бы лучше использовать WeakReference в этих случаях, и это также поможет в управлении памятью, поскольку мы никогда не будем придерживаться сильной ссылки на наш Activity, тогда он будет иметь право на сбор мусора после его искажения.

Проверьте ниже фрагмент кода, чтобы узнать, как использовать awesome WeakReference -

MyTaskInformer.java Интерфейс, который будет работать как информатор.

public interface MyTaskInformer {

    void onTaskDone(String output);

}

MySmallAsyncTask.java AsyncTask выполняет длительную задачу, которая будет использовать WeakReference.

public class MySmallAsyncTask extends AsyncTask {

    // ***** Hold weak reference *****
    private WeakReference mCallBack;

    public MySmallAsyncTask(MyTaskInformer callback) {
        this.mCallBack = new WeakReference<>(callback);
    }

    @Override
    protected String doInBackground(String... params) {

        // Here do whatever your task is like reading/writing file
        // or read data from your server or any other heavy task

        // Let us suppose here you get response, just return it
        final String output = "Any out, mine is just demo output";

        // Return it from here to post execute
        return output;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        // Here you can't guarantee that Activity/Fragment is alive who started this AsyncTask

        // Make sure your caller is active

        final MyTaskInformer callBack = mCallBack.get();

        if(callBack != null) {
            callBack.onTaskDone(s);
        }
    }
}

MainActivity.java Этот класс используется для запуска моего AsyncTask реализации interface в этом классе и override этот обязательный метод.

public class MainActivity extends Activity implements MyTaskInformer {

    private TextView mMyTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mMyTextView = (TextView) findViewById(R.id.tv_text_view);

        // Start your AsyncTask and pass reference of MyTaskInformer in constructor
        new MySmallAsyncTask(this).execute();
    }

    @Override
    public void onTaskDone(String output) {

        // Here you will receive output only if your Activity is alive.
        // no need to add checks like if(!isFinishing())

        mMyTextView.setText(output);
    }
}

101
задан icodebuster 4 May 2013 в 15:44
поделиться

2 ответа

Вы не изменили бы существующие шаблоны. Другими словами, не делайте , изменяют что-либо под /Developer иерархия (или везде, где Вы установили свои инструменты разработчика).

Вместо этого клон шаблоны Вы хотите настроить варианты. Тогда измените их имена и информацию в них. Наконец, поместите их в соответствующее местоположение в папке Вашей учетной записи Library/Application Support, конкретно:

  • шаблоны Файла: ~/Library/Application Support/Developer/Shared/Xcode/File Templates/
  • Целевые шаблоны: ~/Library/Application Support/Developer/Shared/Xcode/Target Templates/
  • шаблоны Проекта: ~/Library/Application Support/Developer/Shared/Xcode/Project Templates/

Тот способ, которым они не будут перезаписаны при установке новых инструментов разработчика, и можно настроить их к содержанию основы.

97
ответ дан Chris Hanson 24 November 2019 в 04:41
поделиться

XCode использует шаблонные файлы для файла и шаблонов проекта и делает переменное расширение в обоих во время создания.

шаблоны Xcode 3.0 могут быть найдены в [Установка Dev]/Library/Xcode/, вероятный/Developer/Library/Xcode. Если Вы хотите изменить эти шаблоны или добавить Ваше собственное, используйте следующие каталоги для сохранения новых/измененных шаблонов так, чтобы они не были вытерты будущими обновлениями Инструмента Разработчика:

  • шаблоны Файла: ~/Library/Developer/Shared/Xcode/File Шаблоны /
  • Целевые шаблоны: ~/Library/Developer/Shared/Xcode/Target Шаблоны /
  • шаблоны Проекта: ~/Library/Developer/Shared/Xcode/Project Шаблоны /

я думаю, что можно также использовать/Library/Developer/Shared/Xcode / [File|Target|Project] Шаблоны / каталог для шаблонов, совместно использованных всеми пользователями.

, Если Вы просто хотите измениться MyCompanyName в шаблонах, следующая командная строка добьется цели:

defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions '{ "ORGANIZATIONNAME" = "NewCompanyName";}'

А хорошее учебное руководство при записи шаблонов файла здесь [MacResearch.org].

32
ответ дан logancautrell 24 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

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