我有一个只包含类方法的类。通常,我使用这些方法来刷新应用程序的数据。
这样,例如,我希望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/

10-13 04:00