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

  • Peyton

    Peyton

    28 Aralık 2008
  • SuicideSheeep

    SuicideSheee

    8 Ocak 2012
  • Vicious Computers

    Vicious Comp

    14 EKİM 2006