最初の非同期通信の完了ブロックで別の新しい非同期メソッドを開始する方法のベストプラクティスを知っている人はいますか?
Facebookへの別の非同期通信の完了コールバックで非同期にNSFetchRequest(coz STACKMOB iOS SDKがサーバーと内部的に同期する)を呼び出すコードをテストしています。コードの実行は、NSFetchRequest の行で突然終了します。うまく動かない原因の一つが分かりました。[managedObjectContext executeFetchRequest:fetchRequest error:&error] が呼び出されるとすぐに、完了ブロックがメモリから解放されたと思います。しかし、それを修正するためのより良い解決策がわかりません。助けてくれてありがとう。
SDK は以下を使用します。
- (void)queueRequest:(NSURLRequest *)リクエスト オプション:(SMRequestOptions *)オプション onSuccess:(SMFullResponseSuccessBlock)onSuccess onFailure:(SMFullResponseFailureBlock)onFailure
https://github.com/stackmob/stackmob-ios-sdk/blob/master/Classes/SMDataStore%2BProtected.m
私は試した:
:
- (IBAction)checkFacebookInfo:(id)sender
{
//completion block of facebook info
void(^onCompleteBlock)(NSDictionary*) = [[^(NSDictionary* userInfo)
{
NSManagedObjectContext *managedObjectContext = nil;
managedObjectContext = [[SingletonCoreData sharedManager] managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"User"];
//for STACKMOB, customized NSFetchRequest internally sync to the server. It is Asynchronous method.
NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&error];// failed
//Not reached here
//set userInfo to results here
} copy] autorelease];
//invoke onCompleteBlock after executing asynchronously, client(SMClient object for STACKMOB)
[client getLoggedInUserFacebookInfoWithOnSuccess:onCompleteBlock onFailure:^(NSError *error)
{
NSLog(@"No user found");
}];
}
編集済み: これを以下に書いてみましたが、うまくいきました。しかし、私はそれが遅いと感じます。コードの一部を「dispatch_async」ブロックに入れました。他のより良い解決策を待っています。
- (IBAction)checkFacebookInfo:(id)sender
{
//completion block of facebook info
void(^onCompleteBlock)(NSDictionary*) = ^(NSDictionary* userInfo)
{
dispatch_queue_t gQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(gQueue, ^{
NSManagedObjectContext *managedObjectContext = nil;
managedObjectContext = [[SingletonCoreData sharedManager] managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"User"];
//for STACKMOB, customized NSFetchRequest internally sync to the server. It is Asynchronous method.
NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&error];// success
//set userInfo to results here
});
};
//invoke onCompleteBlock after executing asynchronously, client(SMClient object for STACKMOB)
[client getLoggedInUserFacebookInfoWithOnSuccess:onCompleteBlock onFailure:^(NSError *error)
{
NSLog(@"No user found");
}];
}