我有一个只包含类方法的类。通常,我使用这些方法来刷新应用程序的数据。
这样,例如,我希望TableViewController从定期提到的第一个类中触发方法。
我还需要在不再显示TableViewController时停止这些调用的可能性。
我现在正在做的可能不是最好的事情:
//myNetworkingClass.h
+(void)methods1:(type*)param1;
---
//myNetworkingClass.m
+(void)methods1:(type*)param1
{
//asynchronous tasks
[[NSNotificationCenter defaultCenter] postNotificationName:@"updateComplete" object:responseObject];
}
//myTableViewController.m
- (void)viewDidLoad
{
//initialization
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateReceived:) name:@"updateComplete" object:nil];
[myNetworkingClass methods1:param];
}
-(void)updateReceived:(NSNotification*)notification
{
//some task, especially update datasource
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 10* NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[myNetworkingClass methods1:param];
});
}
使用这个有3个问题:
添加到主队列后,我无法取消下一次刷新,就像我在关闭TableViewController时应该做的那样,这导致了第二点
因为任务已排队,所以如果我的TableViewController被解雇,我将有一个无用的调用。
myTableViewController是一个通用类,因此我可以创建此类的新对象,并且该对象将收到不兼容的更新通知,并导致崩溃。 (注意:它们不是同时是2 myTableViewController)
我应该如何处理这些限制并写出“整洁的男女”:p
谢谢你的帮助。
编辑
通过@AdamG的链接,我创建了一个NSOperation:
@interface OperationRefresh : NSOperation
-(id)initWithArray:(NSArray *)array andDelay:(int)refreshTime;
@end
@implementation OperationRefresh
{
NSArray *paramA;
int delay;
}
-(id)initWithArray:(NSArray *)array andDelay:(int)refreshTime
{
self = [super init];
paramA = array;
delay = refreshTime;
return self;
}
-(void)main
{
@autoreleasepool {
NSLog(@"sleeping...");
[NSThread sleepForTimeInterval:delay];
NSLog(@"Now Refresh");
[myNetworkingClass methods1:paramA];
}
}
@end
但是我无法取消它。这是我在做什么:
-(void)updateReceived:(NSNotification*)notification
{
//some task, especially update datasource
refreshOperation = [[OperationRefresh alloc] initWithArray:param andDelay:10];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
[refreshOperation start];
});
}
-(void)viewWillDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[refreshOperation cancel];
}
确实,当我的视图消失时,它仍在控制台中写入“ Now Refresh”。
最佳答案
您应该使用NSOperations,它将允许您取消在后台运行的操作。
这里有一个很棒的教程:http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues。
它也更加高效,并且可以防止您的应用因后台任务而落后。
更新
要取消,您必须在NSOperation中手动添加取消。您应该在可能要取消操作的任何地方添加此信息(可能在延迟之前和之后)。
if (self.isCancelled){
// any cleanup you need to do
return;
}
关于ios - 延迟对类方法的调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20211813/