[問題] Block 與 NSURLSESSION 的疑問

看板MacDev作者 (larry122)時間8年前 (2017/07/09 01:26), 編輯推噓2(2012)
留言14則, 6人參與, 最新討論串1/1
目前想寫類似這樣的功能 [self callAPIWithCompletionHandler:^(NSString *strResponse) { 我以為會在這邊執行下方NSLUELSESSION完才繼續往下,所以在這邊寫了 if(xxx=xxx){ [self.navigation push xxx]; } else{ self.navigation push..... } } -(void)callAPIWithCompletionHandler : (void (^) (NSString * strResponse)) completionHandler { NSURLSessionTask *task = [session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // 這邊掠過 }]; [task resume]; } 但她都會先跑完 if(xxx=xxx){ [self.navigation push xxx]; } else{ self.navigation push..... } 之後等讀取完成後再跑一次,導致我同一頁推出去不止一次.. 按上方返回後可以看到大概跑了2.3頁,請問是否我理解錯誤,在block內會先跑到底 等回傳後又再跑一次,還是我哪裡寫法有問題呢!? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.42.76.64 ※ 文章網址: https://www.ptt.cc/bbs/MacDev/M.1499534810.A.E0D.html

07/09 02:18, , 1F

07/09 02:23, , 2F
你的completionHandler(@"xx") 可能擺在[task resume]前
07/09 02:23, 2F

07/09 02:27, , 3F
你的api在哪回應完成的?樓上寫很清楚囉
07/09 02:27, 3F

07/09 09:50, , 4F
nsurlsession的block不是馬上執行的,是要等到網路行
07/09 09:50, 4F

07/09 09:50, , 5F
為資料回來才會執行
07/09 09:50, 5F

07/09 10:14, , 6F
我的需要等NSURLSESSION 回傳才去做 if else 的判斷
07/09 10:14, 6F

07/09 10:16, , 7F
我該怎做才能讓他等待NSURLSESSION執行完成後才往下做呢
07/09 10:16, 7F

07/09 10:18, , 8F
在task的block裡面呼叫你自己的block即可
07/09 10:18, 8F

07/09 11:04, , 9F
好像懂了 ! 我好像搞反了
07/09 11:04, 9F

07/09 11:25, , 10F
那假如我是要 NSString *xxx=[self.completionHandler];
07/09 11:25, 10F

07/09 11:26, , 11F
if(xxx isqqualtostring ooo)
07/09 11:26, 11F

07/09 11:26, , 12F
我應該把if 移動到completionHandler 內這邊?
07/09 11:26, 12F

07/09 11:27, , 13F
我好像又混亂了 ORZ 我想一下
07/09 11:27, 13F

07/09 16:21, , 14F
外層block callback 移到session 完成後回調出去
07/09 16:21, 14F
文章代碼(AID): #1POHNQuD (MacDev)
文章代碼(AID): #1POHNQuD (MacDev)