Цель C Синхронный и асинхронный: почему мой метод протокола вызывается 6 раз? - PullRequest
0 голосов
/ 15 мая 2019

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

У меня есть метод, который отвечает за запрос времени жизни для заголовка в моем приложении:

-(void)checkLiveTimesForHeader {
NSLog(@"Check Live times for header called");

if(self.crewTracker){
    if([MyInternetManager hasInternetConnection]){
        [self updateLoadingLabel];

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [self.crewTracker queryLivePosition];
        });
    } else {
        [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status){
            switch (status) {
                case AFNetworkReachabilityStatusReachableViaWWAN:
                case AFNetworkReachabilityStatusReachableViaWiFi:
                    [self checkLiveTimesForHeader];
                    break;
                default:
                    NSLog(@"Never called");
                    break;
            }
        }];
    }
}

}

Метод queryLivePosition выполняет несколько вычислений и запускает некоторые синхронныезвонки в интернете.Поэтому я использую синхронные вызовы, так как я надеялся, что сценарий «остановится» там, пока не получит результат.Но я предполагаю, что это не так?Но я не знаю, как это решить, поэтому мне нужна ваша помощь ... Так что мой метод queryLivePosition выглядит примерно так:

-(void)queryLivePosition
{
 ...do some stuff

     ... make some synchronous internet call
NSData *data =  [NSURLConnection sendSynchronousRequest:immutableRequest returningResponse:&response error:&error];
...

 //and then the protocol part:
if([self.delegate respondsToSelector:@selector(liveStatusQueried)]) [self.delegate liveStatusQueried];
}

Метод делегата выглядит так:

{
    NSLog(@"LiveStatus queried called");
    NSLog(@"LiveStatus Status: %lu", (unsigned long)self.crewTracker.liveStatus);
    NSLog(@"LiveStatus Results: %@", self.crewTracker.liveQueryResults);
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.headerLayouter getLiveHeaderWithLiveQueryResults:self.crewTracker.liveQueryResults andLiveStatus:self.crewTracker.liveStatus];
    });
}

И мой вывод на консоль выглядит следующим образом:

2019-05-15 15:52:08.508926+0200 FollowMe[3055:137797] LiveStatus queried called
2019-05-15 15:52:08.573481+0200 FollowMe[3055:137797] LiveStatus queried called
2019-05-15 15:52:08.634719+0200 FollowMe[3055:137797] LiveStatus queried called
2019-05-15 15:52:08.720259+0200 FollowMe[3055:137797] LiveStatus queried called
2019-05-15 15:52:08.791063+0200 FollowMe[3055:137797] LiveStatus queried called
2019-05-15 15:52:08.892758+0200 FollowMe[3055:137797] LiveStatus queried called
2019-05-15 15:52:08.939716+0200 FollowMe[3055:137797] LiveStatus queried called
2019-05-15 15:52:08.939849+0200 FollowMe[3055:137797] LiveStatus Status: 1
2019-05-15 15:52:08.939959+0200 FollowMe[3055:137797] LiveStatus Results: (null)
2019-05-15 15:52:08.940071+0200 FollowMe[3055:137797] LiveStatus Status: 1
2019-05-15 15:52:08.940186+0200 FollowMe[3055:137797] LiveStatus Results: (null)
2019-05-15 15:52:08.940286+0200 FollowMe[3055:137797] LiveStatus Status: 1
2019-05-15 15:52:08.940379+0200 FollowMe[3055:137797] LiveStatus Results: (null)
2019-05-15 15:52:08.940476+0200 FollowMe[3055:137797] LiveStatus Status: 1
2019-05-15 15:52:08.940566+0200 FollowMe[3055:137797] LiveStatus Results: (null)
2019-05-15 15:52:08.940661+0200 FollowMe[3055:137797] LiveStatus Status: 1
2019-05-15 15:52:08.940907+0200 FollowMe[3055:137797] LiveStatus Results: (null)
2019-05-15 15:52:08.941207+0200 FollowMe[3055:137797] LiveStatus Status: 1
2019-05-15 15:52:08.941494+0200 FollowMe[3055:137797] LiveStatus Results: (null)
2019-05-15 15:52:08.941780+0200 FollowMe[3055:137797] LiveStatus Status: 1
:52:08.942015+0200 FollowMe[3055:137797] LiveStatus Results: (null)

Таким образом, вывод полностью запутан и не в порядке, поскольку, во-первых, он должен выполняться только один раз (потому что мой метод checkLiveTimesForHeader действительновызывается только один раз!) и все три строки nslog должны выводиться одна за другой, а не так, как этот.Так что я полагаю, что это связано с тем, что интернет-ответ слишком медленный.Но я уже делаю вызов синхронным ... где моя ошибка?

1 Ответ

0 голосов
/ 15 мая 2019

Решено .. извините за пост. Написал два метода setter, которые называли себя этим методом queryLivePosition. И эти два сеттера были вызваны инструкциями журнала ...

...