2012-06-15 24 views
12

ile enqueueBatchOfHTTPRequestOperations sorunu Aynı anda birden çok istek başlatmak için bu AFNetworking yöntemi kullanın: BunlardanAFNetworking: tamamlama bloğu

- (void)enqueueBatchOfHTTPRequestOperations:(NSArray *)operations 
           progressBlock:(void (^)(NSUInteger numberOfCompletedOperations, NSUInteger totalNumberOfOperations))progressBlock 
          completionBlock:(void (^)(NSArray *operations))completionBlock 

biri AFJSONRequestOperation olduğunu. Sorun, bu JSON işleminin başarı bloğunun, partinin tamamlanma-bloğundan sonra yürütülmesidir. Nedeni: AFJSONRequestOperation JSON işleme için bir iç gönderme sırasına sahiptir. Böylece, tamamlama bloğu çağrılırken JSON verileri hala işleniyor.

Soru: tamamlandıktan sonra tamamlama bloğundaki kod yürütme JSON işleminin başarılı bloğu nasıl çağrılabilir?

Ana kuyrukta bir kod bloğu göndermeyi denedim ancak yardımcı olmadı.

cevap

1

Mümkünse, en basit çözüm, işlem kodunuzu her işlemin başarı bloğundan tüm kümenin tamamlama bloğuna taşımak olabilir. Eğer preform gerekiyorsa da operation.request.URL özelliğinde bulunan her operasyon için url adresi

for(AFHTTPRequestOperation *operation in operations){ 
    if(operation.response.statusCode == 200){ 
     //Do something with the response 
    }else{ 
    //Handle the failure 
    } 
} 

:

Sen tamamlanma bloğunda mevcut NSArray *operations, operasyonların yineleme ve bakabilirsiniz var farklı eylemler

+0

OP tamamlanma çağrıldığında json hala işlenmemiş olduğunu söyledi, bu işe yaramaz, değil mi? – kevboh

+0

Evet, bu yüzden soruyorum. Yani bu cevap bana yardım etmiyor. – Felix

+1

Doğru yanlış okumuş. Sorununuz için bekleyebilirseniz yakında bir yama olabilir. https://github.com/AFNetworking/AFNetworking/issues/362 –

0

kaçıncı başlangıcına sizin Json operasyonu taşımak ve başka işlem yalnızca json işleminden sonra başlamak böylece daha sonra bağımlılık ekleyebilirsiniz bitirir:

[lastOperation addDependency:jsonOperation] 
+0

Daha spesifik olabilir misiniz? –

+0

Sanırım şu gibi bir şey: if (previousOperation) {[operation addDependency: previousOperation]; önceki işlevin = çalışması; [işlemler addObject: operasyon]; Benim için işe yaramadı – Sosily

0

OP'nin tam olarak ne istediğini yapmanın kolay bir yolu yok gibi görünüyor, bu yüzden burada bazı kolay çözümler var.

AFJSONRequestOperation yerine AFHTTPRequestOperation kullanmak ve daha sonra NSJSONSerialization kullanarak yanıtı dönüştürmek yerine oldukça künt bir strateji olurdu. bu potansiyel kodu engelliyor büyük JSON yanıtları için ve NSJSONSerialization konulara AFNetworking geçici çözüm yollarından bazıları geçerli olmayacak -

success:^(AFHTTPRequestOperation *operation, id responseObject){ 
       NSError *error ; 
       id json = [NSJSONSerialization JSONObjectWithData:responseObject 
              options:kNilOptions error:&error] ; 
       ... 
      } 

Uyarılar geçerli olacak gibi

Yani operasyonun başarısının bloğu görünecektir. Ama bu seni başarabilir.

güncelle: ilk yorumcu aşağıdaki AFJSONRequestOperation kullanılarak ve toplu tamamlama blok üzerinde responseJSON çağrı göstermektedir. Durumunuz buna izin veriyorsa ben iyiyim. Şu anki kullanımımda kodumu biraz karmaşıklaştırıyor (Karışık bir JSON çağrıları kullanıyorum, bu yüzden kod, işlemle doğrudan ilişkili bir success bloğunda saklayabilirse daha temizdir).

+0

JSON işlemini kullanmak daha mantıklı ve toplu tamamlama bloğunda sadece 'responseJSON' olarak adlandır. Bu yöntem eşzamanlı olarak döner. Bu, OP'nin bahsettiğiniz uyarılar olmadan istediği davranışı sağlar. –

+0

Teşekkür @Aaron. Cevabımı güncelledim. – brainjam