2015-04-02 60 views
0

在一般情況下,我們都會有這樣的我可以在performBlock塊中重新使用上下文嗎?

dispatch_async(dispatch_get_main_queue(), ^{ 
    NSManagedObjectContext *childContext = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease]; 
    childContext.parentContext = self.managedObjectContext; 
    [childContext performBlock:^{ 
     // do something with childContext and save 
    }]; 
}); 

現在我需要與AFHTTPRequestOperationManager發送網絡請求performBlock子/父上下文相關的代碼,

dispatch_async(dispatch_get_main_queue(), ^{ 
    NSManagedObjectContext *childContext = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease]; 
    childContext.parentContext = self.managedObjectContext; 
    [childContext performBlock:^{ 
     [RequestOperationManager POST... parameters... success...{ 
      // Can I re-use childContext here? 
     }]; 
    }]; 
}); 

這樣我就可以重新使用上下文在一塊performBlock?

回答

0

是的,您可以在嵌套在performBlock塊中的完成塊中重用childContext實例。它將被塊保留,直到塊被釋放。

但是,您可能需要使用進一步的嵌套塊,因爲您必須再次使用performBlock將MOC工作分派到childContext的正確隊列,因爲可以將成功塊分派到不同的隊列。這表明您可能希望在成功完成塊中嵌套childContext performBlock調用,與您所示的嵌套相反。但是如果有MOC工作,你打算在POST函數之後的之前完成這兩項工作,那麼你將最終得到另一個嵌套塊。這真的取決於你在這裏包裝僞代碼的真實代碼。

我正在討論的選項,說明。

childContext.parentContext = self.managedObjectContext; 
[childContext performBlock:^{ 
    ... update a NSManagedObject... 
    [RequestOperationManager POST... parameters... success...{ 
     [childContext performBlock:^{ 
      ... update a NSManagedObject... 
      ... (and maybe save) 
     }]; 
    }]; 
}]; 

childContext.parentContext = self.managedObjectContext; 
[RequestOperationManager POST... parameters... success...{   
    [childContext performBlock:^{ 
     ... update a NSManagedObject... 
     ... (and maybe save) 
    }]; 
}]; 

你可以,如果你不與調用成功完成塊POST方法之前突變在childContext任何使用後者。

+0

非常感謝你,重用childContext與另一個performBlock是有意義的。但我不明白你的最後一句話「但是如果你有MOC工作,你打算......」。據我的理解,即使在這種情況下,我仍然可以用你在這裏提出的同樣的方法去。 – 2015-04-02 03:25:52

+0

@ybbaigo ..用類似於你的僞代碼說明。它非常取決於您是否在該「成功」完成塊之前和之內編輯MOC中的任何對象。 – stevesliva 2015-04-02 03:34:37

+0

知道了,再次感謝 – 2015-04-02 04:42:54

相關問題