предотвратить создание нескольких dispatch_queue_create в viewDidLoad - PullRequest
2 голосов
/ 29 июня 2011

имеет представление, которое загружает и создает очередь последовательной отправки, которая загружает кучу материала в фоновом режиме и прекрасно работает. Проблема в том, что когда я перемещаюсь назад и вперед к этому виду, снова создается новая очередь, а затем у меня есть несколько вещей, выполняющих ту же самую работу.

- (void)viewDidLoad {

dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
    dispatch_async(myQueue, ^{
        //function call to a helper outside the scope of this view 
    });
  }

Как мне предотвратить это?

EDIT: создавать свою очередь не было необходимости, поэтому я меняю код - такая же проблема все еще существует.

Ответы [ 3 ]

3 голосов
/ 29 июня 2011

Поместите его в код инициализации или переместите myQueue в переменную экземпляра, а затем проверьте его существование.

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) 
    {
        dispatch_queue_t myQueue = dispatch_queue_create("com.mydomain.myapp.longrunningfunction", NULL);
        dispatch_async(myQueue, ^{
            //function call to a helper outside the scope of this view 
        });
        dispatch_async(myQueue, ^{
            dispatch_async(dispatch_get_main_queue(), ^{
                dispatch_release(myQueue);
            });
        });
    } 
    return self; 
}

Или ...

- (void)viewDidLoad {

    if(!_myQueue)
    {
        _myQueue = dispatch_queue_create("com.mydomain.myapp.longrunningfunction", NULL);
        dispatch_async(_myQueue, ^{
            //function call to a helper outside the scope of this view 
        });
        dispatch_async(_myQueue, ^{
            dispatch_async(dispatch_get_main_queue(), ^{
                dispatch_release(_myQueue);
            });
        });
    }
}

И если вы хотите толькозапустить его один раз за один запуск приложения, которое вы можете использовать dispatch_once

1 голос
/ 30 июня 2011

Итак, вот способ достичь того, чего я действительно желаю, предотвратить запуск отправленных элементов в очереди, когда мой вид извлекается из стека навигации:

Я просто обернул этот код вокруг своего кода, который выполняется в моей отправленной очереди:

-(void) myMethod {
  if (self.view.window) {
   //my code
  }
}

Это пришло от просмотра Стэнфорда видео Blocks & Multithreading здесь: http://itunes.apple.com/us/itunes-u/developing-apps-for-ios-hd/id395605774

отличное видео, помогло много.

0 голосов
/ 21 октября 2013

Если вы используете раскадровку, введите здесь свою инициализацию:

-(void)awakeFromNib{}
...