2011-02-07 18 views
9

-[NSRunLoop runUntilDate:]'u aramak genelde iyi bir fikir midir? Herhangi bir sorun olmadan çalışıyor gibi görünüyor, ancak çalışma döngüsünden çalışma döngüsünden çalışmasını söylemek beni rahatsız ediyor.Arama yapıyor - [NSRunLoop runUntilDate:] iyi bir fikir mi?

diğer bilgiler:

Şu anda bir proje olduğunu REST hizmetinden veri alma olduğunu. Elde edilmesi gereken kritik bir bilgi parçası, geçerli verilere sahip tarih aralığıdır. Bu sadece bir kez alınması gereken çok küçük bir veridir, bu yüzden, bu işlemin en iyi yolunun, yerel değişken nil ise, veriyi indirmesini sağlamak olduğuna karar verdim. ASIHTTPRequest ve ASINetworkQueue kullanıyorum, bu nedenle her şey varsayılan olarak eşzamansızdır ve bunun çalışması için, veriler indirilip işlenene kadar bu özellik geri dönemez. İşte benim kod Ana hatlarıyla, değişkenlerin adları masum korumak için değiştirildi:

__block BOOL isWorking = YES; 
__block ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:/*actual URL*/] autorelease]; 
[request setCompletionBlock:^{ 
    // set local variable 
    isWorking = NO; 
}]; 
[request setFailedBlock:^{ 
    // show alert to user 
    isWorking = NO; 
}]; 
[queue addOperation:request]; 

while (isWorking) { 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 
} 

Yine, bu iyi çalışıyor gibi görünüyor. Bu yaklaşımı kullanarak herhangi bir potansiyel sorun var mı?

cevap

3

Çakışan çağrı ağacı tamamen yeniden girmediği sürece, çağıran çalışma döngüsü tarafından çağrılabilecek herhangi bir yöntemden emin olun.

Kakao Dokunmatik Kullanıcı Arabirimi kodu yeniden giriş olarak belgelenmez (aslında, Apple DTS'den alınmadığı uyarılar/ipuçları vardır), bu nedenle getirme veri işleyiciniz herhangi bir şekilde bir UI yöntemi tarafından çağrılabilirse (veya UI çalışma döngüsünde çağrılabilen başka geçilmez kod), UI çalışma döngüsünün içinden çağrılması önerilmez.

+0

Yani, bu durumda, bu sesler Bu özellik, verileri indirirken meşgulken. Ama eğer kullanıcı meşgulken bir düğmeye basabilir ve bu özelliği tekrar arayabilirse, o zaman havaya uçurur mu? Bilmek güzel. –

+0

Bu özellik doğrudan veya dolaylı olarak herhangi bir UI yöntemi veya temsilci tarafından kullanılıyor mu? Eğer öyleyse, hala büyük bir problem. – hotpaw2

+0

Eminim ki bu kod, kullanıcı UI'nin kullanıcıya sunulmasından önce başlangıçta yüklendiğinde sadece bir kez bu koda basacaktır. Bundan sonra, veriler orada olacak ve yerel değişkeni kullanacaktır. Verileri belirli bir nedenle indiremiyorsa, kullanıcıya kalıcı bir uyarı görüntüler ve başarılı bir şekilde indirilene kadar uygulamaya giremezler. –

4

Bir çeşit döndürücüyü görüntülemek ve ağ kodundaki async tamamlama olaylarına yanıt olarak parçalamak daha iyi olmaz mı? Gibi:

[self displayLoadingSpinner]; 
[request setCompletionBlock:^{ 
    [self handleSuccess]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self hideLoadingSpinner]; 
    }]; 
}]; 
[request setFailedBlock:^{ 
    [self handleFailure]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self hideLoadingSpinner]; 
    }]; 
}]; 
[queue addOperation:request]; 

Ben koşmak döngü ile monkeying daha iyi ele alacak. Ama bunu zaten biliyor olabilirsiniz ve sadece runloop çözümünde tam olarak ne gibi dezavantajların olduğunu bilmek ister misiniz?


değerin hazır olana kadar engellemek istiyorsanız, bir semafor kullanabilirsiniz: bu yaklaşım güvenlidir gibi diyebiliriz başka bir şey yok çünkü

dispatch_semaphore_t sem = dispatch_semaphore_create(0); 
[request setCompletionBlock:^{ 
    dispatch_semaphore_signal(sem); 
}]; 
[queue addOperation:request]; 

dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); 
dispatch_release(sem); 
+0

Bir temsilci/geri çağrı yöntemi yaklaşımı mümkün olsaydı, yaklaşım budur. Bu durumda, mülkten dönmeden önce ayarlanacak değere ihtiyacım var, aksi halde uygulama kötü verilerle devam edecek. Kodu yeniden tasarlayabilirim, böylece tasarım deseni işe yarayacaktı. Bu soru, henüz görmediğim yaklaşımımda beklenmedik bir sorun olup olmadığını bulmakla ilgilidir. –

+0

Semafor yaklaşımı ana parçayı engelleyemez miydi? Bu blokların çalışmasını engeller mi? –

+0

Kullandığınız HTTP kitaplığının nasıl uygulanacağına bağlıdır.Evet, ana iş parçacığı engellenecektir, böylece kütüphane ana iş parçacığı kullanıyorsa, semaforu kullanamazsınız. – zoul

İlgili konular