SORU
14 AĞUSTOS 2011, Pazar


iOS arka Plan iş Parçacığı başlatmak

İOS cihazımda küçük bir sqlitedb var. Bir kullanıcı bir düğmeye bastığında, sqlite verileri yakalıyorum & kullanıcı göstermek.

Bu bir arka plan iş parçacığı (ana UI iş parçacığı engelleme değil) yapmak istiyorum kısmı alınıyor. Yani sanki bu yaptığım

[self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids];

İşleme alınıyor ve biraz sonra UI güncellemek istiyorum. Ama beri (güzel bir uygulama) arka plan iş parçacığı UI güncellemesi yapmak olmamalıdır. selector bir mainthread bu yüzden gibi diyorum

[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];

Ama benim App ilk adımda çöker. bir arka plan iş parçacığı, yani başlangıç. Bu şekilde iOS arka plan iş parçacığı başlatmak için değil mi?

GÜNCELLEME 1:[self performSelectorInBackground.... sonra bu stacktrace, hiçbir bilgi ne kadar - anlıyorum

enter image description here

GÜNCELLEME 2:Ben bile, böyle bir arka plan iş parçacığı başlatma çalıştı [NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids]; ama hala aynı stacktrace.

Ana iş parçacığı üzerinde bu işlemi gerçekleştirmek zaman ben açıklık olsun diye söylüyorum, her şey düzgün çalışan...

GÜNCELLEME 3Bu arka plandan idare etmeye çalışıyorum yöntemdir

- (void)getResultSetFromDB:(NSMutableArray *)toProceessDocids
{
    SpotMain *mirror = [[SpotMain alloc] init];
    NSMutableArray *filteredDocids = toProceessDocids;

    if(![gMediaBucket isEqualToString:@""])
        filteredDocids = [mirror FetchDocIdsForMediaBucketWithDocID:filteredDocids mBucket:gMediaBucket numRes:-1];
    if(![gMediaType isEqualToString:@""])
        filteredDocids = [mirror FetchDocIdsForMediaType:filteredDocids mediaType:gMediaType numRes:-1];
    if(![gPlatform isEqualToString:@""])
        filteredDocids = [mirror FetchDocIdsForPlatformID:filteredDocids platformId:@"1" numRes:-1];

    self.resultSet = [mirror FetchObjectFromDocid:filteredDocids];
    [filteredDocids release];
    [mirror release];

    [self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
    return;
}

CEVAP
14 AĞUSTOS 2011, Pazar


Eğer kullanım performSelectorInBackground:withObject: spawn yeni bir iş parçacığı, daha sonra gerçekleştirilen seçici sorumludur kurma, yeni bir konu değil autorelease havuzu, çalışma döngü ve diğer yapılandırma ayrıntılarını görmek "Using NSObject to Spawn a Thread" AppleProgramlama Kılavuzu Bırakır.

Muhtemelen daha iyi Grand Central Dispatch ama olmak için:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self getResultSetFromDB:docids];
});

GCD yeni bir teknoloji olduğunu ve bellek yükü açısından ve kod satırları daha etkindir.


Güncellendiyukarıdaki kodu daha basit hale getiren bir değişiklik önerdi ve Apple'ın son GCD kod örnekleri ile uydurabilen Chris Nolet şapka bir ipucu ile.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DanceOn

    DanceOn

    6 Mayıs 2006
  • MuscleProdigyTV

    MuscleProdig

    8 Ocak 2011
  • bored before i even began

    bored before

    30 Mart 2009