質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

2回答

3332閲覧

_BSMachError が出る

hideGo

総合スコア8

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/07/25 07:20

###前提・実現したいこと
swiftで実機で開発を行っているのですが、以下のエラーが出る原因がわかりません。
###発生している問題・エラーメッセージ

2016-07-25 15:47:31.059 *******[***:****] _BSMachError: (os/kern) invalid capability (20) 2016-07-25 15:47:31.061 *******[***:****] _BSMachError: (os/kern) invalid name (15)

やっていることは遷移後の画面でセルをタップしたら以下のことをしています。

###該当のソースコード

swift

1let alert = UIAlertController(title: "グループ削除", message: "削除後復元不可", preferredStyle: .Alert) 2let okAction = UIAlertAction(title: "削除", style: UIAlertActionStyle.Default, handler: { [unowned self] (action: UIAlertAction) in 3 let store = CNContactStore() 4 let saveRequest = CNSaveRequest() 5 let groupDel = self.group?.mutableCopy() as! CNMutableGroup 6 saveRequest.deleteGroup(groupDel) 7 do { 8 try store.executeSaveRequest(saveRequest) 9 } catch let error as NSError { 10 print("Delete error \(error.localizedDescription)") 11 } 12 13 tableView.deselectRowAtIndexPath(indexPath, animated: false) 14 self.navigationController?.popToRootViewControllerAnimated(true) 15}) 16alert.addAction(okAction) 17 18let cancelAction = UIAlertAction(title: "しない", style: UIAlertActionStyle.Default, handler: { [] (action: UIAlertAction) in 19 tableView.deselectRowAtIndexPath(indexPath, animated: false) 20}) 21alert.addAction(cancelAction) 22 23self.presentViewController(alert, animated: true, completion: nil)

###試したこと
実際は以下の1行をコメントにすることでエラーは出ません。

self.navigationController?.popToRootViewControllerAnimated(true)

手動で戻るのは問題ないということです。

###補足情報(言語/FW/ツール等のバージョンなど)
swift2.2 xcode7.3.1

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

気になって調べたら以下の様な記事が有りました。
Xcodeのコンソールに"_BSMachError:"が出たらチェックすべきこと
まぁ、この件とは関係ないですね、、、

保存処理は再現できないのでコメントアウトして実行しました、するとワーニングは出ずに遷移できました。
現象が再現出来たのは遷移前にsleep(1)を書くと同じワーニングを確認できました。

推測ですが保存処理に時間がかかっているので出ているのかもしれません。

よって以下のようにすることでワーニングは消えるかもしれません、試してみてください。
※自分の場合はサブスレッドでsleepしてメインで遷移した時にワーニングは出ませんでした。

swift

1import UIKit 2 3class NextViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 } 9 10 override func didReceiveMemoryWarning() { 11 super.didReceiveMemoryWarning() 12 13 } 14 15 @IBAction func showAlert(sender: UIButton) { 16 17 let alert = UIAlertController(title: "グループ削除", message: "削除後復元不可", preferredStyle: .Alert) 18 let okAction = UIAlertAction(title: "削除", style: UIAlertActionStyle.Default, handler: { [unowned self] (action: UIAlertAction) in 19 20 dispatch_async_global { 21 // Sub Thread 22 let store = CNContactStore() 23 let saveRequest = CNSaveRequest() 24 let groupDel = self.group?.mutableCopy() as! CNMutableGroup 25 saveRequest.deleteGroup(groupDel) 26 do { 27 try store.executeSaveRequest(saveRequest) 28 } catch let error as NSError { 29 print("Delete error \(error.localizedDescription)") 30 } 31 32 dispatch_async_main { 33 // Main Thread 34 tableView.deselectRowAtIndexPath(indexPath, animated: false) 35 self.navigationController?.popToRootViewControllerAnimated(true) 36 } 37 } 38 }) 39 alert.addAction(okAction) 40 41 let cancelAction = UIAlertAction(title: "しない", style: UIAlertActionStyle.Default, handler: { [] (action: UIAlertAction) in 42 //tableView.deselectRowAtIndexPath(indexPath, animated: false) 43 }) 44 alert.addAction(cancelAction) 45 46 self.presentViewController(alert, animated: true, completion: nil) 47 } 48} 49 50// ----- 以下も追加 ----- 51 52func dispatch_async_main(block: () -> ()) { 53 dispatch_async(dispatch_get_main_queue(), block) 54} 55 56func dispatch_async_global(block: () -> ()) { 57 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block) 58}

投稿2016/07/26 23:48

_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Swift

1dispatch_async(dispatch_get_main_queue(), { 2 self.navigationController?.popToRootViewControllerAnimated(true) 3})

このように書き換えることで出なくなりませんか?
UIの更新は原則メインキューの中で行うべきです。
そのためUIAlertControllerを生成した中でUIを更新する際は、
メインキューを呼びだして、そのキューに処理を実装してください。

投稿2016/07/26 05:11

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2016/07/26 05:42

そこは元々メインスレッド内だと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問