サーバー上のメッセージを削除するためにサーバーを呼び出すために一度に複数の Web サービス要求を呼び出す必要がある状況にあり、データを更新するためのいくつかのメソッドをトリガーする最良の方法を見つけようとして苦労しています。これらの Web サービス呼び出しのグループが完了したとき。
セマフォカウンターを使用して調査したことから、やりたいことにはうまくいくはずですが、セマフォトークンでdispatch_release()を呼び出すと、アプリケーションがこれでクラッシュするという問題が発生しています-
libdispatch.dylib`_dispatch_semaphore_dispose$VARIANT$mp:
0x3c03ed70: push {r7, lr}
0x3c03ed72: ldr r1, [r0, #40]
0x3c03ed74: mov r7, sp
0x3c03ed76: ldr r2, [r0, #36]
0x3c03ed78: cmp r1, r2
0x3c03ed7a: bge 0x3c03ed7e ; _dispatch_semaphore_dispose$VARIANT$mp + 14
0x3c03ed7c: trap
この問題で私が見つけたものはすべて、セマフォトークンが何かによって参照されていることを示していますが、何がトークンを参照しているのかわかりません。
- (void)deleteMultipleThreadsForMessages:(NSArray *)messages withCompletion:(void(^)(BOOL allThreadsDeleted))completion
{
NSDictionary *userDictionary = [[MSMKeychainAccess sharedKeychain] returnUserDictionary];
long messagesCount = [messages count] - 1;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(messagesCount);
BOOL (^isLastRequest)(void) = ^BOOL (void) {
long result = dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW);
if (0 == result) {
return false;
}
dispatch_release(semaphore);
return true;
};
for (MSMMessageDataModel *message in messages) {
NSDictionary *dictionary = @{@"license": userDictionary[@"license"],
@"messageID" : message.msgID};
NSLog(@"Called this many times! %@", message.msgID);
[[MSMClient sharedClient] soapPostsWithCompletion:^(NSDictionary *response, NSError *error) {
if (error) {
isLastRequest();
completion(NO);
} else {
if (isLastRequest()) {
completion(YES);
}
}
} andRequest:[[[MSMRequestsController alloc] init] createGetMessagesSOAPCallAndSendRequest:@"DeleteThread"
withParameters:dictionary]];
}
}
編集
素晴らしい答えをありがとう。ダスティンが言ったように、私はdispatch_semaphoreを使用すべきではないものに使用しようとしていました。実装が簡単で、Web サービスを送信するために現在行っていることを再構築する必要がなかったため、彼の回答を受け入れました。しかし、dispatch_groups全般については、良い読み物があります。
ご助力いただきありがとうございます!