Блокирует в sharedInstance и отменяет
У меня есть функция загрузки чего-то из интернета. Затем он отображает элементы и возвращает все в контроллер. Проблема в том, что может быть много элементов (Facebook не позволяет их разделять), и я должен отобразить их на заднем плане. Однако пользователь может выйти из контроллера уже, и я не знаю, как проверить, если мой success()
владелец все еще существует.
Это хорошее решение, чтобы поместить отображение в отправку вообще...?
Вызов:
[[MyHTTPClient sharedInstance] getSomethingWithAbc:abc successBlock:^{
[self reloadMyView];
} failureBlock:^(NSError *error) {
//nothing atm
}];
где:
@interface MyHTTPClient : AFHTTPClient
+ (OHTTPClient *)sharedInstance;
- (void)getSomethingWithAbc:(ABC *)abc successBlock:(void (^)())success failureBlock:(void (^)(NSError *error))failure;
Реализация метода:
- (void)getSomethingWithAbc:(ABC *)abc successBlock:(void (^)())success failureBlock:(void (^)(NSError *error))failure {
// request something from facebook API, wait for response then run:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// here map these items - there may be a lot of them so i have to do it in background
dispatch_async(dispatch_get_main_queue(), ^{
success(); // this may call a function from controller that does not exist already
});
}
3 ответа
Однако пользователь уже может выйти из контроллера, и я не знаю, как проверить, существует ли еще мой владелец success().
Что вы имеете в виду, если владелец "все еще существует"?
self
удерживается блоком. Это означает, что "владелец" будет "все еще существовать", пока существует блок. Так что если вы позвоните success()
а контроллер больше не показывает, ну будет reloadMyView
, который (в зависимости от того, что делают ваши функции) "перезагрузит" представление, которое больше не отображается. Что, вероятно, не имеет значения.
Что делать, если вы не хотите звонить reloadMyView
совсем? Ну, вы можете позволить блоку захватить слабую ссылку на "владельца". Это не помешает его освобождению, как обычно. Затем, когда вы вызываете блок успеха и объект освобождается, слабая ссылка, которую вы используете, будет иметь значение nil
и отправив сообщение nil
ничего не делает.
Вы можете выбрать, какой путь вы хотите.
Лучше написать модуль сетевой обработки, независимый от вашего контроллера, и установить метод делегата как - (void)didSuccessWithResult:(NSDictionary*)result; - (void)didFailWithError:(NSError*) ошибка;
или отправить уведомление
В вашем модуле сетевой обработки вы можете определить загрузку работы с MyHTTPClient для завершения метода прокси
Надеюсь, полезно
Это хорошо, но вы должны иметь cancel
операция так, что перед звонком success
, вы можете проверить, была ли операция отменена.