1

我为我的 tableview 实现了一个 refreshcontrol,它工作正常。但我想实现调用另一个类执行该类中的过程。我希望我的 refreshcontrol 应该等到该类的执行。

例如:我在 Player 类中有一些数据库更改。现在 refreshcontrol 在数据库更改正在进行时结束刷新。

-(void)pullToRefresh{
    UpdOther *updO = [[UpdOther alloc] initWithProfile:@"Player"];
    [updO release];
    [refreshControl endRefreshing];
}
4

1 回答 1

1

与其让pullToRefresh方法等待更新,不如在更新过程中简单地使用完成块,这样pullToRefresh可以告诉更新过程在更新完成时要做什么。

例如initWithProfile,您可以有一些方法,比如performUpdateWithCompletiondo it,而不是让执行更新过程,但给它一个完成块:

- (void)performUpdateWithCompletion:(void (^)(void))completionBlock
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // do synchronous update here

        // when done, perform the `completionBlock`

        if (completionBlock) {
            dispatch_async(dispatch_get_main_queue(), ^{
                completionBlock();
            });
        }
    });
}

然后您pullToRefresh可以指定它希望更新过程在完成后执行的操作,例如:

- (void)pullToRefresh{
    UpdOther *updO = [[UpdOther alloc] initWithProfile:@"Player"];
    __weak typeof(self) weakSelf = self;
    [updO performUpdateWithCompletion:^{
        typeof(self) strongSelf = weakSelf;
        [strongSelf.refreshControl endRefreshing];
    }];
    [updO release];
}

还有其他方法(委托模式、通知模式),但我更喜欢基于块的解决方案的内联即时性。


顺便说一句,如果UpdOther正在使用这些NSURLConnectionDataDelegate方法,您显然需要completionBlock从其他方法(例如connectionDidFinishLoading)调用 。因此,在这种情况下,您可以这样定义块属性UpdOther

@property (nonatomic, copy) void (^updateCompletionBlock)(void);

或者,您可以typedef为此块定义一个:

typedef void (^UpdateCompletionBlock)(void);

然后在您的财产声明中使用它:

@property (nonatomic, copy) UpdateCompletionBlock updateCompletionBlock;

无论如何,在这种情况下,您performUpdateWithCompletion将在该属性中保存块的副本:

- (void)performUpdateWithCompletion:(void (^)(void))completionBlock
{
    self.updateCompletionBlock = completionBlock;

    // now initiate time consuming asynchronous update here
}

然后,无论您完成下载,您都可以在那里调用保存的完成块:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // do whatever extra steps you want when completing the update

    // now call the completion block

    if (self.updateCompletionBlock) {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.updateCompletionBlock();
        });
    }
}
于 2013-08-05T14:38:23.997 回答