OGeek|极客世界-中国程序员成长平台

标题: iphone - 防止在 viewDidLoad 中创建多个 dispatch_queue_create [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 08:06
标题: iphone - 防止在 viewDidLoad 中创建多个 dispatch_queue_create

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

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

如何防止这种情况发生?

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



Best Answer-推荐答案


将它放在初始化代码中或将 myQueue 移动到一个实例变量中,然后检查它是否存在。

-(id)initWithNibNameNSString *)nibNameOrNil bundleNSBundle *)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

关于iphone - 防止在 viewDidLoad 中创建多个 dispatch_queue_create,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6525666/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4