2013-08-05 5 views
1

У меня есть обновленный контроль для моего стола, и он отлично работает. Но я хочу добиться вызова другого класса, выполняющего процесс в этом классе. Я хочу, чтобы мой refreshcontrol должен был ждать выполнения этого класса.refreshcontrol endrefreshing должен ждать подкласса

Например: У меня есть некоторые изменения в базе данных в классе Player. Теперь refreshcontrol завершает обновление при изменении базы данных.

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

Существуют и другие подходы, тоже, (делегат шаблон уведомления шаблон), но я предпочитаю непосредственность в линию блочной основе золь социологическое загрязнение.


Кстати, если 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(); 
     }); 
    } 
} 
Смежные вопросы