2014-12-17 2 views
0

Предположим, у меня есть класс UploadManager, и я создаю экземпляр его в моем ViewController. UploadManager.m имеет метод -(void)requestDataКак обрабатывать результат блока завершения между классами

-(void)requestData 
{ 
    HTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] init]; 
    [operation setCompletionBlockWithSuccess:^(HTTPRequestOperation *operation, id responseObject){ 
     // Do something here 
    }]; 
    [operation start]; 
} 

Теперь я могу называть requestData метод из моего экземпляра UploadManager в ViewController.m, но я хотел бы сделать что-то с responseObject внутри ViewController.m после того, как блок завершения уволила. Каков наилучший способ сделать это? Я предполагаю, что могу сделать метод делегата, но мне интересно, есть ли лучшее решение. Благодарю.

+0

Делегаты или уведомления могут быть использованы. – Larme

+1

Это блок. Вы можете добавить любой код, который вам нравится в блоке. – gnasher729

ответ

3

Вы можете использовать структуру блоков для этого

-(void)requestDataWithHandler:(void (^)(id responceObject))handler 
    { 
     HTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] init]; 
     [operation setCompletionBlockWithSuccess:^(HTTPRequestOperation *operation, id responseObject){ 
      // Do something here 

     if(handler) 
     { 
      handler(responceObject) 
     } 
     }]; 
     [operation start]; 
    } 

В другом классе

[uploadManager requestDataWithHandler:^(responceObject) { 
    // here work with responeObject 
    }]; 
+0

Вы должны проверить 'if (handler)' перед вызовом, поэтому вы не сработаете, если это 'nil'. –

1

Подход на основе блока, безусловно, работает. Если вы хотите альтернативный подход к блокам, вы можете использовать NSNotifications следующим образом:

-(void)requestDataWithHandler:(void (^)(id responseObject))handler 
{ 
    HTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] init]; 
    [operation setCompletionBlockWithSuccess:^(HTTPRequestOperation *operation, id responseObject){ 
     // You'll probably want to define the Notification name elsewhere instead of saying @"Information updated" below. 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"Information updated" object:nil]; 
    }]; 
    [operation start]; 
} 

В другом месте в ViewController.m:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomethingUponUpdate) name:@"Information updated" object:nil]; 
} 

-(void)dealloc 
{ 
    // Don't forget to remove the observer, or things will get unpleasant 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (void)doSomethingUponUpdate 
{ 
    // Something 
} 
Смежные вопросы