Я борюсь с этим, я пытаюсь обобщить это с наиболее важными частями кода, связанными с этой проблемой.
У меня есть метод, который отвечает за запрос времени жизни для заголовка в моем приложении:
-(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 должны выводиться одна за другой, а не так, как этот.Так что я полагаю, что это связано с тем, что интернет-ответ слишком медленный.Но я уже делаю вызов синхронным ... где моя ошибка?