0

現在、私はチャットアプリに取り組んでおり、画像をアップロードしようとしています。画像をアップロードするときに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 を呼び出した結果である可能性があります。現在クラッシュ中...

  1. ウェブスレッドロック
  2. -[UITextView setText:]
  3. -[HPTextViewInternal setText:]
  4. -[HPGrowingTextView setText:]
  5. -[chatViewController 送信:]
  6. __74-[chatViewController imagePickerController:didFinishPickingMediaWithInfo:]_block_invoke_0
  7. _dispatch_call_block_and_release
  8. _dispatch_worker_thread2
  9. _pthread_wqthread
  10. 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 で表示している空のサムネイルが取得されます。

4

2 に答える 2

1

UI で何かを変更したい場合は、メイン スレッドで行う必要があります。

したがって、所有しているコントロールのテキストを変更したい場合HPGrowingTextViewは、次の操作を実行できます。

dispatch_async(dispatch_get_main_queue(), ^{
    growingTextView.text = @"Some text";
})
于 2012-08-14T19:20:15.253 に答える
0

メイン スレッドの外側で send を呼び出しているため、クラッシュが発生しています。スタック トレースは、この事実について明らかです。

これらの呼び出しはメイン スレッドで行う必要があります。ただし、そうすると、もちろん、この呼び出しのために UI がハングします...

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

メソッド名から、この呼び出しが同期的であり、結果が返されるまでブロックされることは明らかです。

したがって、代わりに非同期フォームを使用する必要があります。

sendAsynchronousRequest:queue:completionHandler:
于 2012-08-14T19:34:09.753 に答える