現在、私はチャットアプリに取り組んでおり、画像をアップロードしようとしています。画像をアップロードするときにUIがフリーズすることを除いて、すべてが正常に機能しているため、非同期アプローチがシーンに入りました。これが私がやろうとしていることです:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
[self dismissModalViewControllerAnimated:YES];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
UIImage *image = [info objectForKey: UIImagePickerControllerOriginalImage];
NSData *imgData = UIImageJPEGRepresentation(image, 1.0);
//[self performSelectorOnMainThread:@selector(send:) withObject:imgData waitUntilDone:YES];
[self send:imgData];
});
}
このエラーが発生しています:
メイン スレッドまたは Web スレッド以外のスレッドから Web ロックを取得しようとしました。これは、セカンダリ スレッドから UIKit を呼び出した結果である可能性があります。現在クラッシュ中...
- ウェブスレッドロック
- -[UITextView setText:]
- -[HPTextViewInternal setText:]
- -[HPGrowingTextView setText:]
- -[chatViewController 送信:]
- __74-[chatViewController imagePickerController:didFinishPickingMediaWithInfo:]_block_invoke_0
- _dispatch_call_block_and_release
- _dispatch_worker_thread2
- _pthread_wqthread
- start_wqthread
HPGrowingTextView を使用して、iMessage にメッセージを入力するための拡張可能な入力領域を提供していますが、この問題が発生しています。
このエラーを検索しました
メイン スレッドまたは Web スレッド以外のスレッドから Web ロックを取得しようとしました。これは、セカンダリ スレッドから UIKit を呼び出した結果である可能性があります。
人々は使用を提案してperformSelectorOnMainThread
いますが、このアプローチは再びUIをフリーズします。
この競合を解決する方法、または他のアプローチがあります。
Inside [self send:imageData]
...building a url and appending hFile(imageData)
[body appendData:[NSData dataWithData:hFile]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
// setting the body of the post to the reqeust
[request setHTTPBody:body];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
NSString *imgUrl = [NSString stringWithFormat:@"http://www.www.www/uImages/thumbs/%@",returnString];
...
アップロード後、画像のサムネイルが返されます。使用する[NSURLConnection sendAsynchronousRequest
と、uitableview で表示している空のサムネイルが取得されます。