2013-08-05 56 views
1

我已經實現了我的tableview的refreshcontrol並且工作正常。但我想要調用另一個類來執行該類中的過程。我希望我的refreshcontrol應該等到該類的執行。refreshcontrol endrefreshing必須等待子類

例如:我在Player類中有一些數據庫更改。現在,刷新控制在數據庫更改正在進行時結束刷新。

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

回答

1

不必爲更新pullToRefresh方法等待相反,它會更好,如果你只是在更新過程中使用的結束塊,所以pullToRefresh可以告訴更新過程在更新做的目的是做什麼。

例如,而不是讓initWithProfile執行更新過程中,你可以有一些方法,比如說performUpdateWithCompletion做到這一點,但給它一個完成塊:

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

還有其它的方法,也(委託模式,通知模式),但我更喜歡基於塊的溶膠的在線即時性ution。


順便說一句,如果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(); 
     }); 
    } 
}