防止在viewDidLoad中创建多个dispatch_queue_create

时间:2011-06-29 18:48:51

标签: iphone ios grand-central-dispatch

有一个视图,加载和创建的串行调度队列,在后台加载大量的东西,并且工作得很好。问题是,当我在该视图中来回导航时,再次创建一个新队列,然后我有多个事情完成相同的工作。

- (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 
    });
  }

如何防止这种情况发生?

编辑: 创建我自己的队列是没有必要的,所以我改变了我的代码 - 同样的问题仍然存在。

3 个答案:

答案 0 :(得分:3)

将它放入初始化代码中或将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 :(得分:1)

所以这是一种实现我真正想要的方法,当我的视图从导航堆栈中弹出时,阻止我的调度排队项目运行:

我简单地将此代码包装在我的调度队列中运行的代码中:

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

这来自观看Block&斯坦福大学的多线程视频: http://itunes.apple.com/us/itunes-u/developing-apps-for-ios-hd/id395605774

很棒的视频,很有帮助。

答案 2 :(得分:-1)

如果使用故事板,请将初始化放在此处:

-(void)awakeFromNib{}