2012-10-30 12 views
6

MKNetworkKit için yeni'yum, ancak bunu projemde ekledim ve kullanılabilirlik değişiklikleriyle uğraşmak dışında mükemmel çalışıyor.MKNetworkKit işlemi, kullanılabilirlik değiştiğinde devam etmiyor/tamamlanmıyor

  1. ben WiFi devre dışı bırakmak ve uygulamayı çalıştırın: İşte

    durumdur.
  2. Ulaşılabilir olmamakla birlikte,benim MKNetworkEngine alt sınıfımdan bazı verileri (POST kullanarak) kullanarak veriyorum. Veri talep edilmeden hemen önce, işlem dondurulabilir olarak ayarlanır (Mugunth Kumar's doc uyarınca).
  3. WiFi'yi etkinleştirdikten sonra, checkAndRestoreFrozenOperations, MKNetworkEngine'da çağrılır ve beklemede olan bekleyen bir işlemin (ulaşılabilirlik olmadan oluşturulan) olduğunu saptar.
  4. Bundan sonra, onCompletion bloğum hiçbir zaman çağrılmaz.

MKNetworkKit'da donma işlemleri ve erişilebilirlik hakkında anlamadığım bir şey var mı? Donma, yalnızca bir istek sonrası erişilebilirliğin değiştiği operasyonlar için çalışır mı? Ya da kendi ulaşılabilirliğimi değiştirdim blokunu değiştirmeli miyim?

Işlemi oluşturan ve isteği başlatan benim MKNetworkEngine alt sınıfımdaki kod. Alakasız kodun bastırıldığını unutmayın.

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObject:@"value" forKey:@"param"]; 
MKNetworkOperation *op = [self operationWithPath:MYPATH 
              params:params 
             httpMethod:@"POST"]; 
[op setFreezable:YES]; 

[op onCompletion:^(MKNetworkOperation *completedOperation) { 
    // ... 
    // Here is where I process response and send the result to my completion block 
    // It's called when WiFi is available, but not called otherwise. 
    // ... 
} onError:^(NSError *error) { 
    // It's called when WiFi is available, but not called otherwise. 
    DLog(@"Some error"); 
}]; 

[self enqueueOperation:op]; 

return op; 
+0

bir dizi kurmak mı motor Donmuş işlemlerin nasıl ele alınacağına bakarsanız, motor için tanımlanmış bir ana makine olmadıkça çalışmazlar. –

+0

@KenWoo Evet. Motor alt sınıfımdaki init yöntemi "süper initWithHostName: ]". – msoler

+0

@msoler Çalıştığını anladın mı? Benzer bir sorunum var – alandalusi

cevap

6

Bunlar iki ayrı sorun: özgeçmişe karşı tam.

  1. özgeçmiş: önbellek

    Sen AppDelegate -didFinishLaunchingWithOptions içinde -useCache çağırmak zorundadır

    etkinse dondurmak/mekanizması çalışır:

    self.networkEngine = [[MKNetworkEngine alloc] init ...]; 
    [self.networkEngine useCache]; // <- Add this line 
    
  2. tamamlandı: Tamamlama geri bildirimi, ağ durumu değişikliği (örneğin, Çözülmeden sonra) üzerine çağrılan numaralı değil.

    Yine de hattında -checkAndRestoreFrozenOperations eylemi (1.) alıp MKNetworkOperation.m bir kesme noktası yerleştirirseniz:

    [self enqueueOperation:pendingOperation] 
    

    ağ bağlantısı geri geldiğinde çağrılır bulmak ve bu edecektir pendingOperation beklemede olan POST'unuzdur. Ancak, yeni bir MKNetworkOperation örneği oluşturulduğundan (ve sonra tamamlanma bloğu artık mevcut olmayabilir), onCompletion bloğunuz hiçbir zaman çağrılmamaktadır. Bir olası çözüm, geri arama yerine bir bildirim kullanmak olacaktır.

  3. tam bir düzeltme: (2) başlattı boyunca çalışacak daha daha sağlam bir yaklaşım NSNotifications tarafından ^{} blok geri aramalar değiştirmektir. AppDelegate'inizde olduğu gibi dinleyicilerinizi erken kaydedin.Burada, MKNetworkKit bildirimleri konusunda bilgili olmak için gereken minimum değişiklikler şunlardır:

    3a. MKNetworkOperation.h

    yılında takın bildirimleri sabitleri
    #define MKNetworkOperationCompletionNotification @"MKNetworkOperationCompletionNotification" 
    #define MKNetworkOperationErrorNotification @"MKNetworkOperationErrorNotification" 
    

    3b. Yayın MKNetworkOperation.m -operationSucceeded bir başarı bildirim (Öyle bildirim ana iş parçacığı gelen dinledi ve UI değiştirmek edilebilir söyledi postNotificationOnMainThread kullanmak Bildirimi; NSOperation and NSNotificationCenter on the main thread bakınız):

    -(void) operationSucceeded { 
        NSDictionary * aUserInfo = [NSDictionary dictionaryWithObjectsAndKeys: 
         self, NSStringFromClass([MKNetworkOperation class]), 
         nil]; 
        NSNotification * notification = [NSNotification notificationWithName:MKNetworkOperationCompletionNotification 
         object:nil 
         userInfo:aUserInfo]; 
        [[NSNotificationCenter defaultCenter] postNotificationOnMainThread:notification]; 
        ... 
    

    3c. Yayın MKNetworkOperation.m -operationFailedWithError

    -(void) operationFailedWithError:(NSError*) error { 
        self.error = error; 
        NSDictionary * aUserInfo = [NSDictionary dictionaryWithObjectsAndKeys: 
         self, NSStringFromClass([MKNetworkOperation class]), 
         error, NSStringFromClass([NSError class]), 
         nil]; 
        NSNotification * notification = [NSNotification notificationWithName:MKNetworkOperationErrorNotification 
         object:nil 
         userInfo:aUserInfo]; 
    
        [[NSNotificationCenter defaultCenter] postNotificationOnMainThread:notification]; 
        ... 
    

    3d bir hata bildirimi. Bir dinleyici (kaydını unutmayın) olarak, AppDelegate gibi oldukça kalıcı nesne Kayıt:

    // Listen to POST changes 
        NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; 
        [defaultCenter addObserver:self 
         selector:@selector(mkNetworkOperationCompletionNotification:) 
         name:MKNetworkOperationCompletionNotification 
         object:nil]; 
        [defaultCenter addObserver:self 
         selector:@selector(mkNetworkOperationErrorNotification:) 
         name:MKNetworkOperationErrorNotification 
         object:nil]; 
    

    3e. dinleyici gibi görünebilir ne örnek kod:

    - (void)mkNetworkOperationCompletionNotification:(NSNotification*)notification { 
        MKNetworkOperation *operation = [[notification userInfo] 
         objectForKey:NSStringFromClass([MKNetworkOperation class])]; 
        NSLog(@"operationSucceeded: %@", [operation responseString]); 
    } 
    
    - (void)mkNetworkOperationErrorNotification:(NSNotification*)notification { 
        NSError * error = [[notification userInfo] objectForKey:NSStringFromClass([NSError class])]; 
        NSLog(@"operationFailedWithError: %@", [error localizedDescription]); 
    } 
    

yapın, bitirdiniz. X.

(önceki yanıtında MKNetworkOperation.h gereksiz önerilen değişiklikleri kaldırmayı ve Düzenlendi^{} sınırlamaları aşmak için nasıl göstermek için paragraf 3. eklendi.)

+1

Detaylı cevabınız için çok teşekkürler @gothicdev. – msoler

İlgili konular