1

Я пытаюсь получить фоновое обновление приложения, идущее в моем приложении iOS. Тем не менее, у меня есть некоторые проблемы с пониманием блоков кода.Назначить кодовые блоки объекту объекта c

Я провел некоторое исследование по этому вопросу и сказал бы, что у меня есть понимание начинающего. Этот метод является следующим:

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ 

Этот метод требует типа возврата UIBackgroundFetchResult. Из-за сложности моего приложения, однако, я не могу вернуть это с легкостью. Многое происходит, когда вы извлекаете данные из Интернета в фоновом режиме.

В теле этого метода у меня есть собственный метод, который также имеет блок завершения. То, что я пытаюсь сделать, это определить другой пользовательский метод в моем коде, который будет назначен обработчику завершения.

В моем менеджер данных, я это свойство, определяемые как:

@property (copy, nonatomic) void (^fetchCompleted)(UIBackgroundFetchResult); 

В реализации метода performFetchWtihCompletionHandler я призываю мой менеджер данных:

-(void)fetchNewDataWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ 
    _fetchCompleted = completionHandler; 

    _state = DMSMT_WaitingForPartnerData; 
    [self getActiveQueues]; 
} 

После того, как мои загрузки завершены, я позвоните по методу fetchCompleted:

[self fetchCompleted]; 

В этом моя точка зрения oblem. Мне нужно передать аргумент UIBackgroundFetchResult, но я не вижу возможности сделать это. Я попробовал [self fetchCompleted: UIBackgroundFetchResultNewData]; но он кричит на меня.

Любые идеи?

Заранее спасибо.

EDIT:

Здесь был затруднительным. Так просто!

if(_fetchCompleted != nil){ 
    [self fetchCompleted](UIBackgroundFetchResultNewData); 
} 

ответ

3

Вы лечите fetchCompleted как метод, но это блок! Попробуйте это:

-(void)getActiveQueues { 
    // Do some work here 
    // When you are finished... 

    // Set the appropriate result 
    UIBackgroundFetchResult result; 

    // Check to make sure fetchCompleted is not NULL 
    if (self.fetchCompleted) { 
     // Invoke the block! 
     self.fetchCompleted(result); 
    } 
} 
+0

Спасибо! Это отлично поработало. Я ненавижу, когда это такая простая проблема синтаксиса! ugh – Salx

1

Этот метод хочет возвращаемый тип UIBackgroundFetchResult

Нет, он хочет тип void возврата. Один из параметров имеет тип UIBackgroundFetchResult. Параметры не являются результатами возврата. UIBackgroundFetchResult - это только тип переменной.

Который, кажется, попадает в вашу ошибку. [self fetchCompleted] - это получатель, который будет возвращать переменную fetchCompleted. Он ничего не делает с этим.

Чтобы выполнить блок, используйте функциональный синтаксис. Например. [self fetchCompleted]().

+0

Это тоже сработало, спасибо! – Salx

Смежные вопросы