我尝试从异步回调中调用完成块。 但有时我会遇到以下崩溃:
Thread : Crashed: com.apple.main-thread
0 libswiftCore.dylib 0x100bc58e8 swift_unknownRelease + 8
1 Appname 0x100270370 thunk (AccountAlreadyExistsViewController.swift)
2 Appname 0x10021a060 __52-[UserService request:withCompletion:]_block_invoke (UserService.m:1565)
3 Appname 0x10005d2e0 __59-[NetworkService requestPost:withParameter:success:failed:]_block_invoke (NetworkService.m:63)
4 libdispatch.dylib 0x1818554bc _dispatch_call_block_and_release + 24
5 libdispatch.dylib 0x18185547c _dispatch_client_callout + 16
6 libdispatch.dylib 0x18185ab84 _dispatch_main_queue_callback_4CF + 1844
7 CoreFoundation 0x181dc0dd8 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
8 CoreFoundation 0x181dbec40 __CFRunLoopRun + 1628
9 CoreFoundation 0x181ce8d10 CFRunLoopRunSpecific + 384
10 GraphicsServices 0x1835d0088 GSEventRunModal + 180
11 UIKit 0x186fbdf70 UIApplicationMain + 204
12 Appname 0x1002bc334 main (AppDelegate.swift:18)
13 libdispatch.dylib 0x1818868b8 (Missing)
代码如下:
- (void)request:(UserEntity *)userEntity withCompletion:(void(^)(NSDictionary *dict, NSError *error))completion
{
NSString *url = [NSString stringWithFormat:@"%@?dest=%@&type=%@",k_SERVER_REQUES, userEntity.id, "abc"];
__block NSNumber *userContactId = userEntity.id;
[self requestPost:url withParameter:nil success:^(NSInteger status, NSString *message, id data) {
NSError *error;
NSMutableDictionary *rs = data;
if (status == 1)
{ //If no error
FriendModel *friendModel = [FriendModel friendModelWithFriend:"id1" owner:"id2"];
PLog(@"Removing user from database");
[friendModel remove];
}else{
error = [NSError errorWithDomain:@"request" code:-1 userInfo:@{@"status":[NSNumber numberWithInt:status]}];
}
//CRASH HERE SOMETIMES
if (completion) completion(rs, error);
} failed:^(NSString* s) {
// CRASH HERE SOMETIMES
if(completion) completion(nil, [NSError errorWithDomain:@"request" code:-1 userInfo:@{@"detail":s}]);
}];
}
我是否需要在异步块之前创建完成块的弱引用,然后在块中创建它的强引用?看起来有点矫枉过正。我的理论是,在调用异步调用之后,完成块就会被释放,崩溃就会发生...... 完成块不是零,但实际上将释放内存。
Apple推荐这样的东西...... 你怎么看?我该怎么写呢?
修改
从Swift调用请求
myService.request(user, withCompletion: { (dict, error) -> Void in
if let err = error {
log.error("Add, delete or modified request: \(err)")
}
//This completion() block is from the current function
completion?(response: nil, err: error)
})