有一个视图,加载和创建的串行调度队列,在后台加载大量的东西,并且工作得很好。问题是,当我在该视图中来回导航时,再次创建一个新队列,然后我有多个事情完成相同的工作。
- (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
});
}
如何防止这种情况发生?
编辑: 创建我自己的队列是没有必要的,所以我改变了我的代码 - 同样的问题仍然存在。
答案 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{}