2011-01-17 6 views
2

Каков правильный способ оповестить сторожевого пса, что я не в бесконечном цикле, и что я все еще загружаю, чтобы не убить мое приложение?Iphone, как я могу избежать сторожевого пса, убивающего мое приложение, для того, чтобы занять много времени?

Я получаю в моем crashlogs Тип Exception: 00000020 исключительные коды: 0x8badf00d и только при запуске приложения с айфона независимо от Xcode

код нашли время является:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
Reachability* reachability = [Reachability sharedReachability]; 
[reachability setHostName:@"www.apps2you.com"]; // set your host name here 
NetworkStatus remoteHostStatus = [reachability remoteHostStatus]; 

if (remoteHostStatus == ReachableViaWiFiNetwork||remoteHostStatus == ReachableViaCarrierDataNetwork) 
{ 
    //getting the xml file and then getting the ad images online to display as splah ads. 
} 
else { 
//or launch the main interface if there's no connectivity. 
    [self DisplayTabbar]; 
} 
} 

Благодарю.

ответ

5

Если у вас есть инициализация, которая занимает много времени, лучше всего запустить ее в новом потоке (через performSelectorInBackground:withObject:). Тогда ваш пользовательский интерфейс начнется в каком-то «заблокированном» состоянии. Создайте метод, который «разблокирует» пользовательский интерфейс. Как последнее действие вашего фонового метода, запустите этот метод разблокировки с помощью performSelectorOnMainThread:withObject:waitUntilDone:.

Важно не блокировать основной поток, чтобы цикл выполнения мог отвечать на события iOS. Вот почему вам следует избегать sleep или других блокирующих материалов. Но все-таки блокировать в другом потоке. Кроме того, адаптация методов программирования на основе событий очень помогает.

Update:

В настоящее время, лучше использовать dispatch_async вместо performSelectorInBackground:withObject:. Вы должны создать новый NSAutoreleasePool внутри блока dispatch_async, чтобы избежать утечек памяти.

+0

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

+0

Всплеск экрана в порядке, но я бы предложил добавить UIActivityIndicatorView (он же «spinner»), чтобы показать, что что-то происходит. – DarkDust

+0

точно. Но я также заметил что-то странное, что, возможно, вы столкнулись с этим. Когда я вызываю селектор выполнения в фоновом режиме. Я использую экземпляр «self». Но я читаю в консоли много ошибок и утечек !? *** __NSAutoreleaseNoPool(): Объект 0x773e360 класса NSURL автореализован без пула на месте - просто утечка и для других классов NSCFString, NSThread NSHTTPURLResponse ... Как вы думаете? – LolaRun

1

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

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

+0

iOS убивает ваше приложение, если основной цикл запуска не сообщает iOS в течение 30 секунд (насколько я помню). Это не имеет никакого отношения к управлению памятью, все дело в том, чтобы не блокировать основной поток. – DarkDust

+3

открыть приложение и подсчитать в течение 30 секунд, довольно долго ждать, когда что-то загружается. Управление вашей памятью и реструктуризация вашего проекта освободят основной поток и тем самым значительно ускорят загрузку. Я хочу сказать, что в настоящее время пользователи не хотят ждать 30 секунд для приложения, будучи мобильным - это быть мгновенным и портативным –