2016-04-02 21 views
0

ile bile verileri koruyamıyor AFNetworking kütüphanesini bir süredir kullanıyorum ve bir sorunla karşılaştım. Uzak bir PHP dosyasından veri almak için GET işlevini kullanan aşağıdaki kodu kullandım.__block

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 
__block NSDictionary *data = nil; 

[manager GET:@"..." parameters:nil success:^(NSURLSessionTask *task, id responseObject) { 
    data = responseObject; 
} failure:^(NSURLSessionTask *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

_objects = [[data allKeysForObject:@"type"]mutableCopy]; 

Gördüğünüz gibi, ben yerel bir NSDictionary değişken oluşturulur ve başka bir yığın taşması sonrası için bana anlattığına göre, nil olarak ayarlayın. Köşeli parantez içinde her şey yolunda görünüyor; veri doldurulur. Ancak, parantezlerin dışında data tamamen boş. Bunun neden işe yaramayacağına dair bir fikrin var mı? Şimdiden teşekkürler.

DÜZENLEME gibi matiboo nazik yorumlarda belirtildiği , ben AFNetworking her şeyden önce yürütülecek oldu ana farklı bir iş parçacığı üzerinde koştu fark etti.

Hala Ancak bunu düzeltmek nasıl bilmiyorum. Bunu işlemek için bir işlev yapmalı mıyım?

+0

Sen ET'lerle içinde kuyrukta hakkında okumalısınız. 'Başarı' ve 'başarısızlık' bloğu, sunucu yanıt verildikten sonra arka planda sırayla yürütülür. Dış NSLog, [Yönetici ....] komutundan hemen sonra Ana İletide yürütülür. Bu, IO’larda Thread And Queue ile ilgili bir bağlantıdır. Sana AFNetworking [link] (https://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial) –

+0

Ah kullanmadan önce okuyun gerektiğini düşünüyorum. . Anlıyorum. Bunu çözebilmem için herhangi bir yolu var mı? –

+0

Sunucudan dönen Json ile ne yapmak istediğinizi bilmiyorum. Json iadesi işlemine gereksinim duyarsanız, bunu globar değişkenine göre kaydedin (benim _object'iniz), işlemek için bir işlev yazın. Ve içeride 'success' blok, sen [weakSelf HandleData]' Bu responseObject –

cevap

1

_object değişkeniniz başarı bloğu içinde olmalıdır. Geri dönüş bloğu arka plan iş parçacığı içinde yürütüldüğünden, zaman miktarı gerektirir, bu nedenle _objects = [[data allKeysForObject:@"type"]mutableCopy]; komutu, komut satırında komuttan önce kesilir (başarı veya başarısızlık). Böylece, veriler hala sıfırdır. Sizin data

0

dönüş blok biraz zaman alacak olan arka plan iş parçacığı yürütülecektir beri _objects = [[data allKeysForObject:@"type"]mutableCopy];, success bloktan önce çalıştırılacaktır nil nedenidir.

Sen success bloğun içine _objects çalıştırmalısınız. Bunun Bunu takip etmek gibi yapabilirsiniz.

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

[manager GET:@"..." parameters:nil success:^(NSURLSessionTask *task, id responseObject) { 
    _objects = [[responseObject allKeysForObject:@"type"] mutableCopy]; 
} failure:^(NSURLSessionTask *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 
+0

Merhaba; üzgünüm daha erken cevap veremedim. Bloğun içinde _objects atamış olmama rağmen hala veri bloğu dışında veri tutuyordum. Başka bir sebep olabilir mi? –

+0

Kodumu değiştirdiğim şekilde güncelledim. –

+0

Eğer _objects' değişkenin 'değeriyle şey yapmak istiyorsan, hemen sonra bu yöntemi bir yöntem içine koymak ve sonra çağırabilir' _objects = [[responseObject allKeysForObject: @ "tip"] mutableCopy]; 'başarı bloğunun içinde deyim . Bu şekilde, '_objects' kullanılmadan bile öncelenebilir. Umarım bu size yardımcı olur. – Shawon