SORU
1 Aralık 2010, ÇARŞAMBA


Nasıl bitirmek için zaman uyumsuz olarak gönderilir bloğu mi bekleyeyim?

İşleme Grand Central kullanarak zaman uyumsuz Gönderme yapan bir kod deniyorum. Test kodu bu gibi görünüyor:

[object runSomeLongOperationAndDo:^{
    STAssert…
}];

Test işlemi için beklemek bitirmek zorunda. Benim geçerli çözüm bu gibi görünüyor:

__block BOOL finished = NO;
[object runSomeLongOperationAndDo:^{
    STAssert…
    finished = YES;
}];
while (!finished);

Biraz kaba görünüyor, daha iyi bir yol biliyor musunuz? Sıra ortaya çıkarmak ve sonra da dispatch_sync çağırarak blok olabilir:

[object runSomeLongOperationAndDo:^{
    STAssert…
}];
dispatch_sync(object.queue, ^{});

...ama belki de çok fazla object üzerinde teşhir.

CEVAP
1 Aralık 2010, ÇARŞAMBA


dispatch_sempahore kullanarak çalışıyor. Bu gibi görünmelidir:

dispatch_semaphore_t sema = dispatch_semaphore_create(0);

[object runSomeLongOperationAndDo:^{
    STAssert…

    dispatch_semaphore_signal(sema);
}];

dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);

Bu ise runSomeLongOperationAndDo: işlem aslında bir iş parçacığı hak etmek için yeterince uzun değil karar verirse bile doğru şekilde davranır ve yerine eşzamanlı olarak çalışır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChasesAndCrashes

    ChasesAndCra

    31 Temmuz 2009
  • Curso Online Gratuito

    Curso Online

    4 Aralık 2011
  • ibebrent

    ibebrent

    23 Temmuz 2007