превключването на изгледи с nib файлове е изключително бавно

Ще се опитам да дам възможно най-много подробности в тази публикация, защото е много важно да изпълня тази задача и не знам защо получавам тези странни резултати. И така, ето го.

Имам 5 контролера за изглед/.xib файла. Имам също appdelegate и LocationManager singleton клас, предназначен да предоставя на всеки .h/.m файл актуализации на местоположението. View controller 1, известен като WelcomeView, е делегатът за актуализации на местоположението. Така че в него има метода didUpdateLocations. Следи човек да влезе в определена зона. Когато се влезе в тази конкретна зона, тя казва на човека да отиде в друга зона, за да получи нещо като награда. didUpdateLocations следи ВСИЧКИ движения, включително гледане дали лицето влиза както в зона 1, така и в зона 2. Ако лицето успешно влезе в зона 1, трябва да превключи изгледите към TransitionViewController за 3 секунди, след което да превключи към TimerViewController. Ето кода, който използвах за превключване:

self.transitionView = [[TransitionViewController alloc] initWithNibName:@"TransitionViewController" bundle:nil];
[self.view addSubview: self.transitionView.view];

след това в контролера за преходен изглед го карам да заспива за 3 секунди и след това превключвам към timerviewcontroller, като това:

sleep(3);
self.timerView = [[TimerViewController alloc] initWithNibName:@"TimerViewController" bundle:nil];
[self.view addSubview:self.timerView.view];

Когато всъщност влязох в зоната и всичко това трябваше да се случи, първоначално работи като чар. Както се оказва, работи само когато телефонът е включен в Mac и работи от Xcode. Сега стигнах дотам, че отнема само 45 секунди - 1 минута, за да превключите към преход, а след това, когато сте в преход, са необходими допълнителни около 20 секунди, преди да превключите към таймер. Опитах различни неща като поставяне на двете команди в основната нишка, така:

sleep(3);
[[NSOperationQueue mainQueue] addOperationWithBlock:^ {
    NSLog(@"Finished sleeping; switching to timer now.\n");
    self.timerView = [[TimerViewController alloc] initWithNibName:@"TimerViewController" bundle:nil];
    [self.view addSubview:self.timerView.view];
}];

или поставяне на прехода към таймер във фонова нишка, като това:

[self performSelectorInBackground:@selector(transitionToTimer) withObject:nil];

Загубен съм. Не знам защо се случва това и тази работа трябваше да бъде свършена миналата седмица. Някакви предложения за мен? Някой?

РЕДАКТИРАНЕ

Това е най-странната част от него: Ако стартирам приложението, докато вече съм в зона 1, то работи безупречно. Приложението прави точно това, което трябва. Когато вляза в горещата точка, тя се срива или отнема цяла вечност, за да превключите изгледите. Така че, ако приложението работи на телефона ОТ Xcode ИЛИ вече съм в горещата точка, когато стартира, то работи добре. Ако стартирам приложението независимо от xcode и вляза в горещата точка, то се срива или отнема над 60 секунди за превключване на изгледи. Той осъзнава, че трябва да превключи, но не го прави за 60+ секунди.


person Katushai    schedule 11.09.2013    source източник
comment
Не виждам защо това трябва да отнеме 45 секунди, но правите няколко неща погрешно. Изобщо не трябва да използвате заспиване -- ако искате да забавите презентацията, използвайте performSelector:withObject:afterDelay:. Освен това не е добра практика да добавяте изглед на друг контролер към вашия изглед, без да направите този контролер дъщерен контролер на изглед - по-добър подход би бил тези контролери да се представят модално.   -  person rdelmar    schedule 11.09.2013
comment
когато казвате дете, имате предвид като UIView вътре в контролера за изглед? или като изглед на контейнер, поставен вътре в UIViewController, нали?   -  person Katushai    schedule 11.09.2013
comment
Имам предвид използването на API за потребителски изглед на контейнер, но мисля, че не трябва да правите това, а вместо това да представите контролерите модално. Така че вместо [self.view addSubview: self.transitionView.view];, направете [self presentViewController:self.transitionView animated:YES];   -  person rdelmar    schedule 11.09.2013
comment
Благодаря за помощта ви, взех съвета ви и изглежда, че подобри експоненциално времето, но все още е до 25+ секунди   -  person Katushai    schedule 11.09.2013
comment
Спиш ли на основната тема?!   -  person Eiko    schedule 11.09.2013
comment
Опитахте ли да пуснете това през инструмента за профилиране, за да видите какво отнема през цялото време?   -  person Abizern    schedule 11.09.2013
comment
Също така - вместо sleep() или performSelectorAfterDelay, (така, старата школа) опитайте да използвате GCD с dispatch_after()   -  person Abizern    schedule 11.09.2013
comment
Сега, все още ли е бавно превключването от TransitionViewController към TimerViewController или само превключването към TransitionViewController?   -  person rdelmar    schedule 11.09.2013
comment
бавен и за двете промени; добре дошли в прехода, прехода към таймера. знаех, че спането на основната нишка е лошо, но опитвам всяка една възможна опция, за да видя какво ще се случи. профилиращ инструмент? никога не съм го чувал. има ли връзка? промених всичките си режими на заспиване, за да изпълняSelectorAfterDelay. Мога също да публикувам код, ако искате. интересувате се от код? Мога да обясня какво се случва през цялата работа, а вие, момчета, можете да ме разкъсате на парчета колко лош е кодът :P просто научавам goal-c   -  person Katushai    schedule 11.09.2013
comment
също така промених всички addSubview: на presentViewController:. Сега ще тествам и ще видя как ще се развият нещата, за да ви кажа какво се е случило.   -  person Katushai    schedule 11.09.2013
comment
Катастрофа. Просто се разби. Не отне изключително много време или нещо друго, просто ме затвори. Не прави това, когато го стартирам от Xcode на моя iPhone. Какво става?!   -  person Katushai    schedule 11.09.2013


Отговори (1)


Благодаря на всички, които ми помогнаха да изчистя проблемите си с View Controller. Аз съм опитен програмист, но имам малък опит с object-c/cocoa touch. Както и да е, правенето на предложеното с контролерите за изглед ускори прехода експоненциално. Това обаче не реши основния ми проблем. Проблемът беше, че или отнемаше много време за зареждане на приложението, или то щеше да се срине напълно. Разбрах, че проблемът е във факта, че горещата точка е точно извън работата ми, така че когато излязох да я тествам и влязох в горещата точка, wifi връзката беше слаба и нестабилна и в процес на превключване към LTE. През това време приложението разбра, че е в гореща точка и се опитва да изтегли много данни от сървъра чрез NSURL и да ги десериализира чрез NSJSONSerialization. И така, когато влязох в горещата точка, той разбра, защото има GPS чип, който проследява телефона, но wifi превключваше към клетъчни данни и приложението се опитваше да изтегли данните от сървъра, без резултат. Както и да е, проблемът беше решен чрез изключване на wifi по време на тестване за сега. Надолу по пътя възнамерявам да вградя предпазни мерки, предназначени да предпазват от такъв вид хаос. Благодаря отново за помощта на всички. Приятен ден.

person Katushai    schedule 12.09.2013